概述
当用户试图登入一个网站,他们的浏览器会生成一个名为断言的数据结构,这实质上是一个加密签名的邮件地址。浏览器把这个断言发送给网站,网站必须在登入用户前检验断言是否有效。
断言可以本地验证,或使用托管在 https://verifier.login.persona.org/verify
的 API。本页面描述如何使用这个 API。
方法
把 HTTP POST 请求发送至 https://verifier.login.persona.org/verify
。
参数
assertion
: 断言由用户提供。作为传给 navigator.id.watch()
中 onlogin
函数的第一个参数。
audience
: 你的站点的协议、域名和端口。 例如, "https://example.com:443
"。
返回值
调用会返回一个包含 status
元素的 JSON 结构,这个元素值会是 "okay" 或是" failure" 。取决于 status
的值,这个结构包含下面列出的额外元素。
"okay"
断言是有效的。
在这种情况下 JSON 结构包含下面的额外元素:
"email" |
断言中包含欲登录人的邮件地址。 |
"audience" |
断言中包含 audience 值。 期望值为你的网站 URL。 |
"expires" |
断言过期的日期,表示为Date 对象的原始值: 即从 UTC 1970 年 1 月 1 日午夜至今的毫秒数。 |
"issuer" |
发出断言的身份提供者的主机名。 |
"failure"
断言是无效的。这种情况下,JSON 结构包含一个额外元素:
"reason" |
一个解释验证失败原因的字符串。 |
示例
node.js
例中使用了一个采用 express.js 的 node.js 服务器
var express = require("express"), app = express.createServer(), https = require("https"), querystring = require("querystring"); /* ... */ // audience 值必须匹配你浏览器地址栏显示的值, // 包括协议、主机名、端口 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); } else { console.log("failed to verify assertion:", verifierResp.reason); } res.json(email); } catch(e) { console.log("non-JSON response from verifier"); // bogus response from verifier! return null res.json(null); } }); }); 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;