2008年2月12日

python-openidで、simple registration


openidで登録してあるプロフィールを取得できるという話。
2.0から?extensionがあって、simple registrationというextensionが既に存在します。
詳しいことは、参考にて。
openidで新しいサービスを使い始めるときに、openidのプロフィールを使っちゃうってことですな。



さて、python-openidでは、どうやるか。
AuthRequestに、addExtensionArgというそのままのメソッドがあるから、それを使えばいいみたい。
addExtensionっていうのもあるけど、渡すべきインターフェイスの定義がどうなるのか良く分からなかった。



以下のコードで、渡してるのは、2つ。
nsはextensionの名前空間。
simple registrationはsregという名前空間を使う。
required は取得したい項目。
とりあえずemailを取得するようにしてみた。



c = consumer.Consumer(openidsession, filestore)
req = c.begin(request.params['passurl'])
req.addExtensionArg('sreg', 'ns', 'http://openid.net/extensions/sreg/1.1')
req.addExtensionArg('sreg', 'required', 'email')


で、取得する方法。
AuthResponseに、getSignedNSがあってこれを使うとdict形式で、プロフィールを取得できる。
あとgetSignedで、キーまで指定して取得もできる模様。



res = c.complete(request.GET, return_to)
if res.status == 'success':
response.body = "passuri:%s, %s" % (res.identity_url, res.getSignedNS('sreg'))


僕が実際に試したときは、emailと登録してあったからすんなり取得できたんだけど、未登録の場合はどうするんだろう。
responseにsetupってのがあるけど、これが使われるのかな。



APMLなんかは、こうした方法がぴったりだと思うんだけど。
もう、検討されてるのだろうか。


参考