Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Remote Verification API

要約

ユーザが 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 = "https://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('https://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, Marsf
 最終更新者: ethertank,