要約
ユーザが 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;