openID 2.0を使った間接通信

161 views
Skip to first unread message

maito

unread,
Aug 4, 2008, 2:47:26 AM8/4/08
to openid-ja
突然の書き込み失礼します。maitoと申します。

今、ColdFusionを使ってYahoo OpenIdを利用したwebサービスを作りたいなと思っております。

ColdFusionでは、OpenId 1.1に対応しているライブラリはあるのですが、
2.0に対応しているライブラリがぐぐってみつからず、間接通信を使って自作しようと
考えております。

現在、Yahooにhttpリクエスト(get)を出して、xrdsファイルの所在を突き止め
OP EndPoint URLの取得をすることができました。

次に、5.2.2に書かれているHTML フォームリダイレクトを実現しようと、自分のwebページが完了した後、
JavaScriptのonloadで、OP EndPoint URLにgetでフォーム変数のsubmitを行ったのですが、認証ページに遷移せ
ず、
yahoo側に、「このサイトはOpenID2.0の仕様に未対応のサイトです。」といわれてしまいます。

この際、送信時に、フォーム変数として、下記の変数を送信しました。
(wikiの9.1を参考にしました。)

<input type="hidden" name="openid.ns" value="http://
specs.openid.net/auth/2.0" >
<input type="hidden" name="openid.mode" value="checkid_setup" >
<input type="hidden" name="openid.return_to" value="自分のwebページのurl.cfm"
>
<input type="hidden" name="openid.realm" value="http://*.cfm" >

metaタグには、<meta http-equiv="Content-Type" content="text/html;
charset=utf-8">を記載

どのようにすれば、認証ページに遷移できるのでしょうか?

もし、よろしければ教えてください。

よろしくお願いします。

ZIGOROu

unread,
Aug 4, 2008, 4:16:01 AM8/4/08
to openid-ja
サイボウズ・ラボの山口です。

> 現在、Yahooにhttpリクエスト(get)を出して、xrdsファイルの所在を突き止め

これを Yahoo 以外の OP にした場合はどうなりますか?
送るべきパラメータが欠如しているとか、あるいは associate してないからとかそういう理由な気がします。
( 全然吟味してないですが )

maito

unread,
Aug 4, 2008, 8:28:08 PM8/4/08
to openid-ja
山口さん

おはようございます、maitoです。

ご返信ありがとうございます。

>これを Yahoo 以外の OP にした場合はどうなりますか?

さっそく、myOpenIdで試したところ、「Identifierをセットしてください。」というエラーメッセージページに遷移しました。

User-Supplied Identifierは、ユーザーが入力した、yahoo.co.jpから「http://
www.yahoo.co.jp」と文字列を生成すればいいと思うのですが、これを元にdiscoveryを行うと思うと、Identifierは、@ITにあったOP-Local
Identifierのことかなと思いました。
(http://www.atmarkit.co.jp/fsecurity/rensai/openid05/openid03.html)

ここで、OP-Local Identifierは、RPは値を取得することは可能なのでしょうか?
> > よろしくお願いします。- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

Nat Sakimura

unread,
Aug 5, 2008, 4:53:06 AM8/5/08
to open...@googlegroups.com

ん~、ちょっと何をどこまでやっているのかがわかりませんね...。

もうちょっと、ステップを追って(省略せずに)何をやっているのかを書かないと...。

ステップとしては、

1. OpenID入力
2. Discovery
3/4 Association確立
5. 認証要求をOPへ送信
6. RP Discovery
7.(クレデンシャル入力)
8. 認証結果をRPへ送信
9. 結果検証時のDiscovery
10/11. 署名の検証
12. ログイン完了

とあるのですが、それぞれのステップで何をどうやっていて、どのようなデータを送っているかが分かれば、もう少し的確な回答ができると思います。

#ちなみに、いただいているメールだと、Association に何も触れていないので、その辺が落ちているような気がしますが...。


=nat
2008/8/5 maito <mai.musi...@gmail.com>



--
Nat Sakimura (=nat)
http://www.sakimura.org/en/

maito

unread,
Aug 6, 2008, 9:45:53 PM8/6/08
to openid-ja
Nat Sakimuraさん

おはようございます、maitoです。
ご返信ありがとうございます。

>ん~、ちょっと何をどこまでやっているのかがわかりませんね...。

すみません、自分でも完全に把握していなくて、すみませんでした。

書いていただいたステップ順に書いていきたいと思います。

1.OpenIdの入力
<input type="text">にyahoo.co.jpと入力し、自分のページにsubmitしました。(送信方法はpostです)

2. Discovery
・ColdFusion(サーバーサイドの言語)で、入力した、yahoo.co.jphttp://yahoo.co.jpに変換しました。
http://yahoo.co.jpにhttpリクエストをgetで通信しました。
・レスポンスのヘッダーからX-XRDS-LocationのURLを発見しました。
・発見したX-XRDS-LocationのURLにHttpリクエストをgetでxmlを取得しました。
・もらったxmlをパースし、OP EndPoint URLを取得しました。

3/4 Association確立
http://openid-japan.org/wiki/index.php/OpenID_Authentication_2.0にある、付
録 Bの値を使って、4.2. 整数表現に記載のbtwoc 文字列表現に変換しました。
・変換した文字をBase64に変換しました。
・OP EndPoint URLにpostでhttp通信を行いました。
その際の各種パラメータは以下に設定しました(openid.の部分は省略します)
ns:http://specs.openid.net/auth/2.0
mode:associate
assoc_type:HMAC-SHA1
session_type:DH-SHA1
dh_modulus:上で変換した文字列
dh_gen:\x02をBase64に変換した文字列
dh_consumer_public:\x02をBase64に変換した文字列
・上の通信により以下の情報を取得できました。
ns:http://specs.openid.net/auth/2.0
assoc_handle:文字列
session_type:DH-SHA1
assoc_type:HMAC-SHA1
expires_in:14400
enc_mac_key:文字列
dh_server_public:文字列
mac_keyは取得できませんでした。

5. 認証要求をOPへ送信
・OP EndPointURLにpostでhttpリクエストをだしました。
その時に、以下のパラメータも送信しました。
ns:http://specs.openid.net/auth/2.0
mode:checkid_setup
claimed_id:null
identity:http://specs.openid.net/auth/2.0/identifier_select
assoc_handle:取得したassoc_handleの値
return_to:自分のホームページのurl
realm:http://*.com

と送信したのですが、ログイン画面に遷移できませんでした。

箇条書きになってしまいましたが、以上です。
よろしくお願いいたします。


On 8月5日, 午後5:53, "Nat Sakimura" <sakim...@gmail.com> wrote:
> ん~、ちょっと何をどこまでやっているのかがわかりませんね...。
>
> もうちょっと、ステップを追って(省略せずに)何をやっているのかを書かないと...。
>
> ステップとしては、
>
> 1. OpenID入力
> 2. Discovery
> 3/4 Association確立
> 5. 認証要求をOPへ送信
> 6. RP Discovery
> 7.(クレデンシャル入力)
> 8. 認証結果をRPへ送信
> 9. 結果検証時のDiscovery
> 10/11. 署名の検証
> 12. ログイン完了
>
> とあるのですが、それぞれのステップで何をどうやっていて、どのようなデータを送っているかが分かれば、もう少し的確な回答ができると思います。
>
> #ちなみに、いただいているメールだと、Association に何も触れていないので、その辺が落ちているような気がしますが...。
>
> =nat
> 2008/8/5 maito <mai.musicfact...@gmail.com>
> Nat Sakimura (=nat)http://www.sakimura.org/en/- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

Nat Sakimura

unread,
Aug 6, 2008, 11:44:19 PM8/6/08
to open...@googlegroups.com, openid-ja
claimed_Id もidentityと同じものをセットして下さい。

あと、realm がいくらなんでも広すぎると思います。


iPhoneから送信

maito

unread,
Aug 19, 2008, 9:17:25 AM8/19/08
to openid-ja
Natさん

こんばんわ、maitoです。
ご返信遅くなりまして大変もうしわけございません。

教えていただきまして本当に本当にありがとうございます。

さっそく、claimed_Id にidentityと値をセットし、realmをhttp://www.アドレス.comに変更した後、http通信
(post)を
行ったところ、無事にyahooにログインすることができました。(6. RP Discovery)

最初、yahooのページに遷移した時、すごく感動してしまいました。

その後、yahooページにてパスワードを入力(7.(クレデンシャル入力))に、元の自分のページに
リダイレクトを行うことができました。(8. 認証結果をRPへ送信 )

リダイレクト後、ページが元に戻った後、url変数で、以下の情報を取得できました。

ns
mode=id_res
op_endpoint
claimed_id
identity
return_to
response_nonce
signed
assoc_handle
sig
realm
ns.pape
pape.auth_policies
nist_auth_level

invalidate_handleは取得できませんでした。

上の情報を元に、元々のreturn_to、op_endpoint、nsとの比較を行いました。
(9. 結果検証時のDiscovery)

「10/11. 署名の検証」として、mode="check_authentication"にして、
上で取得した情報をすべてデコードし、再度、http通信(post)を
行った結果、is_validがfalseを返ってきました。

すでに、identityが取得できたので、falseでも
処理を進めて大丈夫のような気がするのですが、
trueではないので、エラーだと思い、不安です。

他にパラメータを送信する必要があるのでしょうか?

教えていただけたらと思います。

どうか一つよろしくお願いいたします。

On 8月7日, 午後12:44, Nat Sakimura <sakim...@gmail.com> wrote:
> claimed_Id もidentityと同じものをセットして下さい。
>
> あと、realm がいくらなんでも広すぎると思います。
>
> iPhoneから送信
>
> >> Nat Sakimura (=nat)http://www.sakimura.org/en/-引用テキストを
> >> 表示しない -
>
> >> - 引用テキストを表示 -- 引用テキストを表示しない -
>
> - 引用テキストを表示 -
Reply all
Reply to author
Forward
0 new messages