ラベル OpenId の投稿を表示しています。 すべての投稿を表示
ラベル OpenId の投稿を表示しています。 すべての投稿を表示

2008/10/31

[openID]gmailがopenIDに対応

ちょーいいータイミンgooー♪

お気づきでないかもしれないが、みなさんもたぶん知らず知らずの間にOpenIDはもう持ってると思う。
・・・
そして今日からはGoogleのメールアカウントを持ってる人も、GmailのメールアドレスをOpenIDとして使えるようになった。

via:GmailアカウントもOpenIDに

気づかない、気づかない。

ちょーど来週、PHPセミナーの作品発表会を控えていえ、ちょーどopenidを使いたかったんだけど、ちょうどいいタイミングでした。

ここで、問題になってくるのは、バージョンはいくつなんだろう??
2の場合、以前、作ったCFをちょろよちょろといじればいけそうなのですが。。。

google APIを調べてみると、

Google supports the OpenID 2.0 Directed Identity protocol, and provides authentication support as an OpenID provider.

via:Federated Login for Google Account Users

と書かれていたので、なんとかちょっとの変更でいけそです。

なんとラッキーな!!

2008/09/13

[OpenID]いい記事~♪

ぐぐったらたまたま見つけました。

OpenID認証2.0~概論

いい記事なので、OpenIDを勉強したい方にお勧め!!

後、ここのpdfファイルもよかったです。

2008/08/13

[ColdFusion][OpenID]Association確立

今回は、Associationの確立方法について。

簡単に言ってしまうと、前々回に取得したOP EndPoint URLにhttpリクエスト(POST)を出せばオッケーなのですが、その際に、以下のパラメーターを送信する必要があります。

openid.ns
openid.mode
openid.assoc_type
openid.session_type
openid.dh_modulus
openid.dh_gen
openid.dh_consumer_public

リファレンスから、openid.nsは「http://specs.openid.net/auth/2.0」で、openid.modeは、「associate」というところまでは、わかったのですが、問題はここから。

次の、openid.assoc_typeは、特に推奨がなかったので、「HMAC-SHA1」をセット。

HMAC-SHA1を選択したので、openid.session_typeは「DH-SHA1」をセットしました。

ここからがやばかった。。。

openid.dh_modulusは、「base64(btwoc(g))」と書かれているのですが、これっていったい何??

base64の部分は、btwoc(g)で得た文字列か数字をbase64に変換すればいいので、CFのToBase64()を使えばいけそうな気がするのですが。。。

問題は、btwoc(g)の部分で、gの部分に付録Bの値をセットするところまではOKで、btwocは何をすればいいの??

4.2. 整数表現 (Integer Representations)の部分を読むと、

任意精度の整数は big-endian signed two's complement binary で符号化されなければならない (MUST)。従って、"btwoc" は任意精度の整数を引数としてとり、最小の big-endian two's complement representation として返す関数である。Diffie-Helman 鍵交換で使われる整数は全て正である。これは、the two's complement representation 最左ビットは常にゼロでなければならない (MUST) ことを意味する。

via:4.2. 整数表現 (Integer Representations)

と書かれていて、さらにわかりません。

ただ、説明の下にあった例を見ると、どうやら、以下のプロセスを経て数字が生成されていそうな気がしました。

1:10進数を16進数に変換
2:2桁ずつ区切り、それぞれの頭に「\x」を付ける
3:先頭の数字を2進数に変換してみて、1だった場合、一番先頭に「\x00」を追加する

リファレンスの例を元に考えてみます。

10進数:0 16進数:0 2進数:0→\x00
10進数:127 16進数:7F 2進数:0110 1111→\x7F
10進数:128 16進数:80 2進数:1000 0000→\x00\x80

と確かに、推測した文字列になってします。

この要領で、付録Bの値をbtwocに従ったアルゴリズムに変換しました。
<cfset KeyValue = "付録Bの値">
<cfparam name="tempKeyValue" default = "">
<cfparam name="KeyValueRest" default = "#KeyValue#">
<cfloop index="i" from="1" to="#Len(keyValue)/2#">
<!--- 左から2文字分を抜き出し、文字列結合する --->
<cfset tempKeyValue = tempKeyValue&"\x"&Left(KeyValueRest,2)>
<!--- テンポラリー文字列の長さが2文字よりも小さくなるまで行う --->
<cfif Len(KeyValueRest) gte 2>
<!--- 左から3番目以降の文字列を抜き出す --->
<cfset KeyValueRest = Mid(KeyValueRest,3,Len(KeyValueRest) - 2) >
</cfif>
</cfloop>
<!--- 頭に「\00」をつけ、Base64に変換を行う --->
<cfset dh_modulus = ToBase64("\x00"&tempKeyValue)>

最後に「\00」をつけている理由は、付録Bの先頭の値が、「C」なので、それを2進数変換とすると、「1100」となるので、追加しました。

この勢いで、デフォルトの2を使って「openid.dh_gen」の値をセットします。

で、最後のopenid.dh_consumer_publicですが、リファレンスでは「base64(btwoc(g ^ xa mod p))」と書かれていて、gとpは、すでに決まっているのですが、「xa」はどうするだろうか???

ここで、バカ正直に、xaを任意に設定し、「g ^ xa mod p」をやろうとすると、おそらくメモリーがもたないだろうと思いました。

というのも、pの値が、付録Bに記載されている値だったので、modすると、確実にやばいと思ったので、ここは、g ^ xa mod pの値自体を任意に設定することにしました。

任意の数字(x)を設定した後、base64(btwoc(x)とし、これですべてのパラメータがそろい、あとは、httpリクエスト(post)するだけ

<cfset KeyValue = "付録Bの値">
<cfparam name="tempKeyValue" default = "">
<cfparam name="KeyValueRest" default = "#KeyValue#">
<cfloop index="i" from="1" to="#Len(keyValue)/2#">
 <!--- 左から2文字分を抜き出し、文字列結合する --->
 <cfset tempKeyValue = tempKeyValue&"\x"&Left(KeyValueRest,2)>
 <!--- テンポラリー文字列の長さが2文字よりも小さくなるまで行う --->
 <cfif Len(KeyValueRest) gte 2>
  <!--- 左から3番目以降の文字列を抜き出す --->
  <cfset KeyValueRest = Mid(KeyValueRest,3,Len(KeyValueRest) - 2) >
 </cfif>
</cfloop>
<!--- 頭に「\00」をつけ、Base64に変換を行う --->
<cfset dh_modulus = ToBase64("\x00"&tempKeyValue)>
<cfset dh_gen = ToBase64("\x02")>

<cfset tempKeyValue = 0>
<cfset KeyValueRest = KeyValue>
<cfloop index="i" from="1" to="#Len(keyValue)#">
 <!--- 右から一文字抜き出して10進数変換を行う --->
 <cfset tempKeyValue = tempKeyValue + InputBaseN(Right(#KeyValueRest#,1),16) * (16^(#i#-1))>
 <cfif i lt Len(keyValue)>
  <cfset KeyValueRest = Mid(KeyValueRest,1,Len(KeyValueRest)-1)>
 </cfif>
</cfloop>
<cfset dh_consumer_public = ToBase64("任意の数字")>

<!--- httpリクエスト --->
<cfhttp url="#ReqUrl#" method="post" redirect="yes">
 <cfhttpparam type="formField" name="openid.ns" value="http://specs.openid.net/auth/2.0" >
 <cfhttpparam type="formField" name="openid.mode" value="associate">
 <cfhttpparam type="formField" name="openid.assoc_type" value="HMAC-SHA1">
 <cfhttpparam type="formField" name="openid.session_type" value="DH-SHA1">
 <cfhttpparam type="formField" name="openid.dh_modulus" value="#dh_modulus#">
 <cfhttpparam type="formField" name="openid.dh_gen" value="#dh_gen#">
 <cfhttpparam type="formField" name="openid.dh_consumer_public" value="#dh_consumer_public#">
</cfhttp>

2008/08/09

[openID]ログインまでの道のり

前に、[ColdFusion][OpenID]取得したXRDSについてで、OP EndPoint URLを取得するところまで書きました。

しかし、その後、もう何をどうやってよいのかわからず、google groupに相談しました。

そしたら、なんと、なんと、なんと、返信があったのです。(超感動)

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

via:google group:Nat Sakimuraさんからの返信

おーなるほどー。これ通り行えばログインできるんだなー♪♪♪

「2. Discovery」まではできたので、「3/4 Association確立」に取り組みたいと思います。

話は変わりますが、Natさんから返信を頂いたのですが、実は、ものすごく有名な方なんだー。

OpenIDファウンデーション・ジャパンの発起人代表で、野村総研の情報技術本部 技術調査部 上級研究員である崎村夏彦氏

via:国内でOpenID推進団体が設立へ――4月に正式発足

すごいを通り越してびっくりしました。

まさか、まさか、OpenId Japanを作った方に、直接コメントをいただけるとは。

うれしいあまり感謝感激です。

この場を借りて、Nat Sakimuraさんに感謝の言葉を。

ありがとうございます。

普通に過ごしていたんじゃー決して出会うことのない方たちと出会い、コミュニケーションをとることで、色々な可能性が広がっていく感じがします。

インターネットってすごいですね。

2008/08/05

[ColdFusion][OpenID]取得したXRDSについて

おととい、Yadisプロトコルを利用して、XRDSを取得できたことを書きました。

今日は、その続きから、さっそくファイルを開いてみると

<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS
    xmlns:xrds="xri://$xrds"
    xmlns:openid="http://openid.net/xmlns/1.0"
    xmlns="xri://$xrd*($v*2.0)">
  <XRD>
    <Service priority="0">
      <Type>http://specs.openid.net/auth/2.0/server</Type>
      <URI>https://open.login.yahooapis.jp/openid/op/auth</URI>
    </Service>
  </XRD>
</xrds:XRDS>

となってました。URIタグの中にあるテキストが、OP Endpoint URLなんですけど、OP Endpoint URLとは

エンドユーザが指定した識別子(User-Supplied Identifier)に対し行った発見行為(Discovery)で得たOpenID認証プロトコルのメッセージを容認するURLを示す。
この値は必ず完全なHTTPかHTTPS URLでなくてはならない。

via:OpenID Authentication 2.0

とつまり、OpenIDを使ってエンドユーザーログインするページのことだと判断しました。

OP Endpoint URLを使って間接通信を行おうと思います。

あと、ColdFusionでXMLをパースして、タグの直下にあるテキストを取得したい場合、XRDSを例にとると、

<cfset RetXML = XmlParse(cfhttp.fileContent)>
<cfset ReqUrl = RetXML.xrds.XRD.Service.URI.XMLText>

と最後に、XMLTextを書くのがポイント。

これを忘れてしまうとタグまで取得してしまい、思わぬところで、ハマルところになります。
(というかハマリました)

なので、注意したいっすね。

2008/08/03

[OpenId]日本語訳あるじゃん

OpenID 2.0の仕様書の日本語版がありました。

これで苦労しなくてすみそー。

2008/08/02

[ColdFusion][OpenId]YadisプロトコルでXRDSを取得

今日は、何から書いていいのか。。。

ものすごく悩みまくって、ようやくここまでたどり着きました。

結論からいうと、ColdFusionを使って、Yahooが発行しているXRDSの位置を突き止める方法がわかったのです。

あまりにも悩みすぎて、どういう順序でここまできたのか、すべて思いだせないのですが、思いだせる範囲で書いていきます。

昨日の話とかぶりますが、yahooでゲットできるOpenIdを使って認証するログイン画面を、今、作ろうとしています。

で、ログイン方法は、OpenId 2.0に準拠した方法でログインできるところまで、書きました。

そこで、具体的にどうやってログイン方法を実装するか、色々と調べました。

ひたすらぐぐったのですが、全然、ColdFusionを使った実装方法が見つりませんでした。

唯一見つかったのはCFOpenIDにあるプログラムで、ダウンロードして使えばいけるのかなと思ったのですが、ダメでした。

というのも、このプログラムを使った認証方法は、OpenId 1.1に準拠した方法なので、ダメだったのです。

そこで、ColdFusionでぐぐってもラチがあかないなと思い、そもそも、「OpenIdとはなんぞや??」というところからスタートしたほうがいいかなと思い、@マークItのOpenIDの仕様と技術とgihyo.jpのいますぐ使えるOpenIdを読みました。

読んだのはいいのですが、肝心の実装方法が、それぞれ、PerlとRubyで書かれていたため、基本的な用語しか理解できず、最終的に、OpenId.netのOpenID Authentication 2.0 - Finalも合わせて読んでいきました。

と読んでいくうちに、どうやら、Yadisプロトコルを使ってEndpoint URLをゲットすればいいことがわかりました。

yahooのデベロッパーサイトにも、そのことについて書かれています。

ってことは、Yadisを使ってEndpoint URLをゲットすれば、とりあえず少しは前進できるのかなと思いました。

この段階で、Yadisプロトコルは、http通信を使えばおそらくできるのではないのかなーという推測がありました。

案の定、Yadisの仕様書(html版)を見てみると、Yadis IDにhttpリクエストをgetで送ると、XRDSをゲットできることがわかりました。

でも、Yadis IDってなんぞや??
そう思いながら、仕様書を読んでいくと、どうやらhttpかhttpsで始まるurlであることがわかりました。

urlであることはわかったのですが、果たして、どこのurlなのでしょうか?

この段階で、yahooのデベロッパーページを見てみると、特定のurlの記載がなかったので、おそらく「http://www.yahoo.co.jp」だろうなーと推測して、色々と調べてみたら、案の定、ビンゴでした。

id:lopnorさん(超感謝です)の OpenID2 つうか Yadis はじめましたの記事で、yahoo.comにhttpリクエストを送った結果が表に書かれていて、その中に、なんと、なんと、「X-XRDS-Location: http://open.login.yahooapis.com/openid20/www.yahoo.com/xrds
」という文字があったのです。

これで推測が正しいことが判明し、後は、cfhttpタグでyahoo.co.jpにhttpリクエストのgetメソッドで送ればいいんだなーということがわかりました。

というわけで、ここまでを総合して、以下、ソースです。

<cfprocessingdirective pageencoding="utf-8">
<cfhttp url="http://www.yahoo.co.jp"
method="get"
redirect="no"
/>
<cfoutput>
<cfset keyToArray = StructKeyArray(cfhttp.responseHeader)>
<table>
 <tr><td>responseHeader</td><td>value</td></tr>
 <cfloop index="i" from="1" to="#ArrayLen(keyToArray)#">
  <tr><td>#keyToArray[i]#</td><td>#cfhttp.responseHeader[Evaluate("keyToArray[i]")]#</td></tr>
 </cfloop>
</table>
</cfoutput>

で、返ってきた結果(レスポンス)の一部は、こちらです。
Photobucket
これで、Yadisプロトコルも怖くないぞと。

ゲットしたXRDSについては、今度、書きたいと思います。

2008/08/01

[Mashup Awards][OpenId]yahoo IDを使う

マッシュアップの一つに、yahoo IDを認証するサービスを利用しようかなと考えているのですが、yahoo IDは、OpenID 2.0に対応しているらしく、Open IDと同じ認証方法でログインページを作成できるみたいです。

果たして、ColdFusionを使ってどうやって作ればいいのだろうか??