OP-Initiated Flow(2)

OP駆動のOpenIDについて少し書いたOP-Initiated Flow - r-weblifeの動作イメージをつかむために少し動かしてみました。
自分用のメモなので、説明はやさしくないかもしれません。

1. OPを用意

いつも使っているPHPライブラリのOP exampleのほうを使います。
http://r-weblife.sakura.ne.jp/server/server.php
画面はこんな感じです。

振り返りになりますが、OP駆動のOpenIDの目的は「OPでログイン状態であるユーザーをRPに送る際にシームレスにログイン(状態を判別できる状態に)させたい」ということです。

初めに、OPでログイン状態になることから始めましょう。

2. OPにログイン

ログインリンクをくりっくすることで簡単なログイン画面に遷移します。

サンプルOPなのでPWは不要です。
サンプルユーザー名をデフォルトでいれておいたのでそのままログインします。
最初の画面に戻り、ログイン状態になっていることがわかります。

3. RP駆動のOpenIDログイン

まず、よく知られているRPからのログインを試してみます。
「サンプルRPはこちらです」からRPに遷移します。

ここでは、OpenID入力フォームにOPでログイン状態のサンプルユーザーのOpenIDを入れてあります。
そのまま続けることでOpenIDのログインを行います。

4. RPを確認

これは通常フローであるRP確認画面です。

5. RPに戻り認証完了

これで通常のRP → OP → RPのログインが完了しました。

6. OP駆動でRPにログイン

最後に、OP → RPのログインを試します。
OP-Initiated Flow - r-weblifeでいうところのRP確認画面と言っている画面遷移直前のOP上のページを用意しました。

リンクをクリックすることでOpenID認証+RPへのリダイレクトが行われます。
とりあえずなので、POSTとかGETとかの細かい話は省略で。

7. RPに戻り認証完了

今回はOP,RP間でAssociationを確立していませんので、RPに遷移したあとcheckid_authenticationでいきなり送りつけられたアサーションを確認します。

■ 今回やってみて気づいたこと

『OP側の実装はそんなに大変ではなさそう』

  1. return_toを知る
  2. Statelessモードの認証要求を自分自身のエンドポイントに送信
  3. OP駆動のときだけRP確認画面を省略?

1はRP Discoveryでわかるようにしておきたいですね。
2は最初アサーション発行を自前で追加しようと思ったけどめんどくさかったのでさぼれないかなーって思いながら見ていたら、なりすましのような感じで自分に送っちゃえばいいかなって思いました。
3はOPのページでRPへ遷移することをしっかり説明しているのであれば2で認証要求後に出てくる確認画面をスキップしていいかなって思った感じです。
まぁ、ポリシーかユーザビリティあたりできまるのでしょう。

『RP側の実装はもっと簡単』

  1. OpenIDの機能に何かを追加する必要はなし。checkid_authenticationはもちろん実装してるよねと。
  2. OPから送られたユーザーをどのように次のURLに遷移させるかぐらい。

2は何を言いたいかというと、OPからRPのURL_Xに遷移させたいときにどのようにしてURL_XをRPに伝えるかということです。
return_to URLにパラメータとして『redirect=URL_X』を指定するルールを決めておくか、あらかじめバックグラウンドで『今からURL_Xにユーザーを送りたい』と要求しておくかってとこでしょうか。

画像ばっかりですみません。
最後に一言。「OP駆動は枯れてない」