ここの情報は古いです。ご理解頂いた上でお取り扱いください。

Opened 12 years ago

Closed 12 years ago

Last modified 11 years ago

#1762 closed enhancement (fixed)

OpenIDのサーバ(プロバイダ)になれるようにする

Reported by: kunitada Owned by: ogawa
Priority: critical Milestone: OpenPNE2.12beta1
Component: pne-masterslave Version:
Keywords: 親チケット Cc:

Change History (37)

comment:1 Changed 12 years ago by kunitada

Summary: OpenIDのサーバになれるようにするOpenIDのサーバ(プロバイダ)になれるようにする

comment:2 Changed 12 years ago by kunitada

Description: modified (diff)

comment:3 Changed 12 years ago by tejimaa

Type: enhancementproject

comment:4 Changed 12 years ago by yamaji

あと、もう一歩のところかも知れない。実験は失敗続き。

comment:5 Changed 12 years ago by yamaji

vmWareを使いコンシューマー側とサーバー側とを分離してもだめ、 ひょっとするとIdPをほかのものに取り替えるとうまくいくかも。

comment:6 Changed 12 years ago by maruyama

OpenIDの簡単な動作フローは以下のようになります。 ここで、OpenIDのプロバイダは以下の二つのページを用意する必要があります。

▽プロバイダが準備するページ ◆ユーザホーム これはh_homeをSNS外部に公開するためのページにあたります。 ただし、このページにユーザ情報を載せる必要はなく、必須なものは

<link rel="openid.server" href="http://sns.openpne.jp/?m=openid&a=page_auth" />

のように、次に説明する認証確認ページのURLを示すタグとなります。

◆認証確認ページ ページはOpenIDの認証時にそのOpenIDに認証を求めているサイトに許可を出すかどうかをユーザが選択するページとなります。 また、このURLは認証を求めるクライアントサイトとプロバイダサイトで通信認証を行うための共有キーなどの発行などにも利用されます。

▽ログインフロー ◆OpenIDでの認証を許可しているサイトでユーザが自身のユーザID(上記のユーザホームのURLがユーザIDとなる)を入力する。

◆認証を求められたサイトが入力されたユーザIDにアクセスし、認証確認ページのURLを取得し、ユーザに認証確認ページへリダイレクトさせる。(その際どのサイトからの認証か、またセキュリティのための確認情報などはGETパラメータで渡される)

◆認証確認ページでプロバイダが認証を求めるサイトに対し、ユーザに許可をするとかどうかを確認する。許可した場合、その情報をまたGETパラメータで持たせて認証を求めるサイトのURLにリダイレクトする。

◆プロバイダ側で許可されている場合、認証が成功したとみなしログイン処理を行う

comment:7 Changed 12 years ago by maruyama

▽デモ

wordpressの認証をopenidで行うデモを以下に設置しています。

◆OpenPNE(プロバイダ)

http://openid-demo.lily.pne.jp/

◆wordpress

http://wordpress-demo.lily.pne.jp/

OpenPNEのユーザを用いてwordpressで認証を行うことができます。OpenID用のユーザID(ホーム)は

http://openid-demo.lily.pne.jp/?m=openid&a=page_home&id=(メンバーID

です。c_member_id=1の場合は

http://openid-demo.lily.pne.jp/?m=openid&a=page_home&id=1

となります。

このユーザIDを

http://wordpress-demo.lily.pne.jp/wp-login.php

の最下段のフォームに入れると認証ステップに入ります。

もしOpenPNEにログインしていない場合はログイン画面に飛ばされ、ログインすると認証ステップに戻ります。

ログインが成功した場合はblogでコメントつけるなどをすることで、ユーザIDがhttp://openid-demo.lily.pne.jp/?m=openid&a=page_home&id=(メンバーID)として認識されていることが分かると思います

現状では認証機能の実装のみですが、ニックネームなどの情報を渡す拡張もあるようなので、その機能の実装によってhttp://openid-demo.lily.pne.jp/?m=openid&a=page_home&id=(メンバーID)以外のユーザIDとしてwordpressに登録できるのかもしれません

comment:8 Changed 12 years ago by maruyama

上記のOpenIDのプロバイダ機能を実装したソースは

https://svn.openpne.jp/svn/OpenPNE/branches/prj/openid

にコミットしています。

ただし、OpenIDの動作をさせることを目的とした実装であるため、

◆認証画面のデザイン

◆ユーザIDのURLで表示されるユーザ情報

などは仕様が決定されていないため、必要最低限の実装になっています。

comment:9 Changed 12 years ago by maruyama

r5027

にてOpenIDの機能の使用選択をできるように修正しました。

define('IS_OPENID_PROVIDER', false);

をtrueにすることで機能が使用可能になります。

comment:10 Changed 12 years ago by kunitada

>saitoさん http://www.cl.cam.ac.uk/~sjm217/misc/openid-protocol.pdf

  • 1) p,gをどこでどう計算しているか
  • 2) X,x,Y,y をどこでどう計算しているか
  • 3) hをどこでどう計算しているか
  • 4) tvをどこでどう計算しているか
  • 5) HMACk(I,C,n,t) をどこでどう計算しているか

が知りたいです

comment:11 Changed 12 years ago by saito

kunitadaさん

pは素数で比較的大きな値を取ります。OpenID1.1ではデフォルト値が 以下のように定められています。OpenPNEも同様です。

Appendix A. デフォルト値 Appendix A.1. Diffie-Hellman P Value http://wiki.openid.net/OpenID_Authentication_1.1_%28ja%29#Appendix_A._.E3.83.87.E3.83.95.E3.82.A9.E3.83.AB.E3.83.88.E5.80.A4

1551728981814736974712322577637155\ 3991572480196691540447970779531405\ 7629378541917580651227423698188993\ 7278161526466314385615958256881888\ 8995127215884267541995034125870655\ 6549803580104870537681476726513255\ 7470407658574792912915723345106432\ 4509471500722962109419434978392598\ 4760375594985848253359305585439638443

gは2以上の自然数です。OpenPNEでは2と指定しています。

http://trac.openpne.jp/browser/OpenPNE/branches/prj/openid/lib/include/Auth/OpenID/DiffieHellman.php?rev=5026

comment:12 Changed 12 years ago by saito

X,Yはコンシューマとプロバイダの公開鍵です。 x,yはコンシューマとプロバイダの秘密鍵です。

g = h^{(p-1)/q} mod p
X = g ^ xa mod p
Y = g ^ xb mod p 

^ P ∧ Q」は「命題 P と命題 Q がともに真」という命題を表す
mod 「x mod y」は x を y で割った余りを表す。

ZZ = (y ^ X) mod p = (x ^ Y) mod p

comment:13 Changed 12 years ago by saito

hはbase64bitを使ってプロバイダが生成したセッション情報を操作しています。Association.phpには、シリアライズ用の関数とデシリアライズ用の関数が用意されています。

tvはスクリプト上は$lifutimeとして扱われています。プロバイダからバリデートされてからの有効期限を示します。現状、OpenPNEでは有効期限は設定していません。

HMACk(I,C,n,t)は、SHA1の暗号化を使ってアイデンティティ、コンシューマ、プロバイダ、現在時刻のデータの通信を行っています。HMACkを使うことによって通信の信頼性を確保しています。

comment:14 Changed 12 years ago by kunitada

携帯はURLの文字数制限があるので、POSTとかでわたすようにしよう。

comment:15 Changed 12 years ago by saito

OpenIDの携帯対応、プロバイダ側からコンシューマにリダイレクトされるときに500文字くらいのGETパラメータが返ってくるから、SO902iなどの携帯のURL文字数制限を超えちゃいますね。プロバイダ側のスクリプトをいじってPOSTで認証データを受け渡すか、XML-RPCなどで認証情報を交換するかなどの調査・検討が必要かと思います。

comment:16 Changed 12 years ago by saito

r5202 OpenPNEがOpenIDプロバイダで複数のコンシューマの認証要求に対応する (署名問題対応版)をコミットしました。POSTの問題は残っています

comment:17 Changed 12 years ago by ebihara

Milestone: OpenPNE2.11.5
Owner: changed from yamaji to saito

このチケットの作業内容が既に r5281 時点で trunk に入っているので、とりあえず次期開発版OpenPNE2.11.5の対応項目としたいと思います。

comment:18 Changed 12 years ago by ebihara

Type: projectenhancement

comment:19 Changed 12 years ago by ebihara

Keywords: 確認中 added

内容の確認をお願いします。

comment:20 Changed 12 years ago by ebihara

Keywords: 確認中 removed
Milestone: OpenPNE2.11.5OpenPNE2.11.6

ソースコードレベルのチェックをおこないましたが、

  • 未定義の関数をコールしている箇所がある(webapp/modules/openid/page/auth.php 35行目、getSreg())
  • キー名のみ検証済みのレスポンスを、以下のようにHTTPヘッダとして送信している(値のチェックや改行を取り除くなどのサニタイズ処理をしていない)
     46             $webresponse =& $server->encodeResponse($response);
     47 
     48             foreach ($webresponse->headers as $k => $v) {
     49                 header("$k: $v");
     50             }
    
  • init.inc でなぜか携帯版使用設定をみている
     11 //<PCKTAI
     12 if (!OPENPNE_ENABLE_KTAI) {
     13     // disable pc module
     14     exit;
     15 }
     16 //>
    
  • IS_OPENID_PROVIDER が事実上無効化されている(init.inc)
     18 //<OpenID
     19 if (!(defined('IS_OPENID_PROVIDER') && IS_OPENID_PROVIDER)) {
     20     // disable pc module
     21 //    exit;
     22 }
     23 //>
    

など、問題点が散見されたことや、意図している挙動が見えにくいことなどを考え、今回のリリースからは外します。

comment:21 Changed 12 years ago by ebihara

r6113 で trunk から変更を外しました。

comment:22 Changed 12 years ago by ebihara

Priority: criticalmajor

comment:23 Changed 12 years ago by imamura623

Milestone: OpenPNE2.11.6OpenPNE2.11.7

2.11.6では見送ります。

comment:24 Changed 12 years ago by ogawa

Owner: changed from saito to nobody
Priority: majorcritical

comment:25 Changed 12 years ago by kiwa

Owner: changed from nobody to kiwa
Status: newassigned

画面仕様つくります

comment:26 Changed 12 years ago by kiwa

Owner: changed from kiwa to nobody
Status: assignednew

r6547 にて画面仕様が必要な部分の画面仕様を作成しました

comment:27 Changed 12 years ago by kiwa

Description: modified (diff)

comment:28 Changed 12 years ago by ogawa

Owner: changed from nobody to ogawa
Status: newassigned

trunk に取り込みます。

comment:29 Changed 12 years ago by kiwa

#2251 メンバーがOpenIDのIDを確認する方法を考える

taskで別チケット作成しました

comment:30 Changed 12 years ago by ogawa

Milestone: OpenPNE2.11.7OpenPNE2.12beta1

comment:31 Changed 12 years ago by ogawa

最低限の実装は終わったので、trunkにマージしました。r6694

comment:32 Changed 12 years ago by ogawa

■課題

  • メンバーがOpenIDのIDを確認する方法(#2251)
  • 一度許可したConsumerを次回以降確認なしで許可できる機能
  • 許可したConsumerのリスト確認、削除機能
  • WordPress以外のConsumerでの試験
  • sreg への対応
  • 他、なにかいろいろ実装してなかった気がする

comment:33 Changed 12 years ago by ogawa

ブランチの作業履歴です。

log:OpenPNE/branches/work/ogawa/openid@6668:6693

comment:34 Changed 12 years ago by ogawa

Keywords: 確認中 added

comment:35 Changed 12 years ago by ebihara

Keywords: テスト待ち added; 確認中 removed

comment:36 Changed 12 years ago by kiwa

Keywords: テスト待ち removed
Resolution: fixed
Status: assignedclosed

comment:37 Changed 11 years ago by kiwa

Keywords: 親チケット added
Note: See TracTickets for help on using tickets.