mozilla

远程验证 API

概述

当用户试图登入一个网站,他们的浏览器会生成一个名为断言的数据结构,这实质上是一个加密签名的邮件地址。浏览器把这个断言发送给网站,网站必须在登入用户前检验断言是否有效。

断言可以本地验证,或使用托管在 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 = "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);
            } 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('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

文档标签和贡献者

向此页面作出贡献: teoli, yinian1992
最后编辑者: teoli,