Remote Verification API

  • リビジョンの URL スラッグ: Persona/Remote_Verification_API
  • リビジョンのタイトル: Remote Verification API
  • リビジョンの ID: 315185
  • 作成日:
  • 作成者: Marsf
  • 現行リビジョン いいえ
  • コメント

このリビジョンの内容

要約

ユーザが Web サイトにログインしようとする時、ブラウザが アサーション と呼ばれるデータ構造を生成します。このデータの内容は、暗号化された署名付きのメールアドレスです。ブラウザは、このアサーションを Web サイトに送信し、ユーザにログインを許可する前にアサーションが正当か検証されます。

アサーションはローカルで検証することもできます。または、https://verifier.login.persona.org/verify でホストされた API でも検証できます。このページでは、この API の使い方を説明します。

メソッド

https://verifier.login.persona.org/verify に HTTP POST リクエストを送信します。

引数

assertion: ユーザが提供したアサーション。{{ domxref("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;

Via Christian Heilmann

このリビジョンのソースコード

<h3 id="Summary" name="Summary">要約</h3>
<p>ユーザが Web サイトにログインしようとする時、ブラウザが <em>アサーション</em> と呼ばれるデータ構造を生成します。このデータの内容は、暗号化された署名付きのメールアドレスです。ブラウザは、このアサーションを Web サイトに送信し、ユーザにログインを許可する前にアサーションが正当か検証されます。</p>
<p>アサーションはローカルで検証することもできます。または、<span class="link-https"><code>https://verifier.login.persona.org/verify</code></span> でホストされた API でも検証できます。このページでは、この API の使い方を説明します。</p>
<h3 id="Methods" name="Methods">メソッド</h3>
<p><code>https://verifier.login.persona.org/verify</code> に HTTP POST リクエストを送信します。</p>
<h3 id="Parameters">引数</h3>
<p><code>assertion</code>: ユーザが提供したアサーション。{{ domxref("navigator.id.watch()") }} の <code>onlogin</code> 関数に渡す最初の引数として使います。<br />
  <code>audience</code>: あなたのサイトのプロトコル、ドメイン名、ポート番号。例えば、"<code>https://example.com:443</code>" と指定します。</p>
<h3 id="Return_values">戻り値</h3>
<p>この API を呼び出すと、<code>status</code> 要素を含む JSON データ構造を返します。この要素は、"okay" と "failure" のどちらかになります。<code>status</code> の値に依存して、JSON データに以下の追加の要素が含まれることがあります。</p>
<h4 id=".22okay.22">"okay"</h4>
<p>アサーションは正当です。</p>
<p>この場合、JSON データ構造に次の追加要素が含まれます:</p>
<table border="1" cellpadding="1" cellspacing="1" style="width: 80%;">
  <tbody>
    <tr>
      <td><code>"email"</code></td>
      <td>アサーションに含まれるメールアドレス。これは、ログインしようとしているユーザのものです。</td>
    </tr>
    <tr>
      <td><code>"audience"</code></td>
      <td>アサーションに含まれる audience 値。あなたの Web サイトの URL であることが期待されます。</td>
    </tr>
    <tr>
      <td>"<code>expires"</code></td>
      <td>アサーションの有効期限日。<a href="docs/JavaScript/Reference/Global_Objects/Date/valueOf" title="docs/JavaScript/Reference/Global_Objects/Date/valueOf">Date オブジェクトの初期値</a> を表します。これは、1970 年 1 月 1 日の午前 0 時 (UTC) から経過したミリ秒単位の値です。</td>
    </tr>
    <tr>
      <td><code>"issuer"</code></td>
      <td>アサーションを発行した ID プロバイダのホスト名。</td>
    </tr>
  </tbody>
</table>
<h4 id=".22failure.22">"failure"</h4>
<p>アサーションは不正です。この場合、JSON データ構造に 1 個の追加要素が含まれます:</p>
<table>
  <tbody>
    <tr>
      <td><code>"reason"</code></td>
      <td>検証が失敗した理由を説明する文字列。</td>
    </tr>
  </tbody>
</table>
<h3 id="Examples">コード例</h3>
<h4 id="node.js">node.js</h4>
<p>このコード例は、express.js を使用する node.js サーバを使用します。</p>
<pre class="brush: js" style="margin-left: 120px;">
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 &amp;&amp; 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!");
});

</pre>
<p>via <a class="link-https" href="https://github.com/lloyd/myfavoritebeer.org/blob/06255b960e1f9078bc935c1c7af0662f33c88818/server/main.js#L112" title="https://github.com/lloyd/myfavoritebeer.org/blob/06255b960e1f9078bc935c1c7af0662f33c88818/server/main.js#L112">Lloyd Hilaiel</a></p>
<h4 id="PHP">PHP</h4>
<pre class="brush: php">
$url = 'https://verifier.login.persona.org/verify';
$assert = $_POST['assert'];
$params = 'assertion='.$assert.'&amp;audience=' .
           urlencode('http://example.com:80');
$ch = curl_init();
$options = array(
    CURLOPT_URL =&gt; $url,
    CURLOPT_RETURNTRANSFER =&gt; TRUE,
    CURLOPT_POST =&gt; 2,
    CURLOPT_POSTFIELDS =&gt; $params
);
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
</pre>
<p>Via <a class="link-https" href="https://github.com/codepo8/BrowserID-login-with-PHP/blob/184fdb74c8a554461c262875859968154d09288e/verify.php">Christian Heilmann</a></p>
Revert to this revision