Remote Verification API リダイレクト 1

要約

ユーザが Web サイトにログインしようとする時、ブラウザが アサーション と呼ばれるデータ構造を生成します。このデータの内容は、暗号化された署名付きのメールアドレスです。ブラウザは、このアサーションを Web サイトに送信し、ユーザにログインを許可する前にアサーションが正当か検証されます。

アサーションはローカルで検証することもできます。または、https://verifier.login.persona.org/verify でホストされた API でも検証できます。このページでは、この API の使い方を説明します。

メソッド

https://verifier.login.persona.org/verify に HTTP POST リクエストを送信します。

引数

assertion: ユーザが提供したアサーション。navigator.id.watch()onlogin 関数に渡す最初の引数として使います。
audience: あなたのサイトのプロトコル、ドメイン名、ポート番号。例えば、"https://example.com:443" と指定します。

戻り値

この API を呼び出すと、status 要素を含む JSON データ構造を返します。この要素は、"okay" と "failure" のどちらかになります。status の値に依存して、JSON データに以下の追加の要素が含まれることがあります。

"okay"

アサーションは正当です。

この場合、JSON データ構造に次の追加要素が含まれます:

"email" アサーションに含まれるメールアドレス。これは、ログインしようとしているユーザのものです。
"audience" アサーションに含まれる audience 値。あなたの Web サイトの URL であることが期待されます。
"expires" アサーションの有効期限日。Date オブジェクトの初期値 を表します。これは、1970 年 1 月 1 日の午前 0 時 (UTC) から経過したミリ秒単位の値です。
"issuer" アサーションを発行した ID プロバイダのホスト名。

"failure"

アサーションは不正です。この場合、JSON データ構造に 1 個の追加要素が含まれます:

"reason" 検証が失敗した理由を説明する文字列。

コード例

node.js

このコード例は、express.js を使用する node.js サーバを使用します。

var express = require("express"),
    app = express.createServer(),
    https = require("https"),
    querystring = require("querystring");
/* ... */

// audience は、ブラウザのアドレスバーに表示されている URL と一致しなければなりません。
// プロトコルとホスト名、ポート番号を含みます。
var audience = "http://localhost:8888";

app.post("/authenticate", function(req, res) {
  var vreq = https.request({
    host: "verifier.login.persona.org",
    path: "/verify",
    method: "POST"
  }, function(vres) {
    var body = "";
    vres.on('data', function(chunk) { body+=chunk; } )
        .on('end', function() {
          try {
            var verifierResp = JSON.parse(body);
            var valid = verifierResp && verifierResp.status === "okay";
            var email = valid ? verifierResp.email : null;
            req.session.email = email;
            if (valid) {
              console.log("assertion verified successfully for email:", email);
              res.json(email);
            } else {
              console.log("failed to verify assertion:", verifierResp.reason);
              res.send(verifierResp.reason, 401);
            }
          } catch(e) {
            console.log("non-JSON response from verifier");
            // 検証側から偽の応答がありました!
            res.send("bogus response from verifier!", 401);

          }
        });
  });
  vreq.setHeader('Content-Type', 'application/x-www-form-urlencoded');

  var data = querystring.stringify({
    assertion: req.body.assertion,
    audience: audience
  });
  vreq.setHeader('Content-Length', data.length);
  vreq.write(data);
  vreq.end();
  console.log("verifying assertion!");
});

via Lloyd Hilaiel

PHP

$url = 'https://verifier.login.persona.org/verify';
$assert = $_POST['assert'];
$params = 'assertion='.$assert.'&audience=' .
           urlencode('http://example.com:80');
$ch = curl_init();
$options = array(
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_POST => 2,
    CURLOPT_POSTFIELDS => $params
);
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
curl_close($ch);
echo $result;

Via Christian Heilmann

ドキュメントのタグと貢献者

最終更新者: ethertank,