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

    文档标签和贡献者

    此页面的贡献者有: yinian1992, teoli
    最后编辑者: teoli,