スキップしてメイン コンテンツに移動

ドコモIDでOpenID認証してみる

Google App Engineでは、簡単にOpenID認証できる仕組みがある。

今回は、ドコモID(OpenID)を使ってユーザー認証させてみた。



アプリケーションの設定

GAEのアプリケーション設定で、Authentication Typeを「Federated Login」に変更する。

認証が必要なページの指定

認証が必要なページは、app.yamlのスクリプトハンドラ(login: required)で指定できる。今回は/member/配下のパスについては認証が必要としてみた。

app.yaml
- url: /member/(.*)
  script: controllers.front.member.application
  secure: optional
  login: required

認証要求ページの作成

非ログイン状態で、認証が必要なページにアクセスされると /_ah/login_required へリダイレクトされる。なので、app.yamlにこのパスについてのスクリプトハンドラを指定しておき、「認証が必要です。どのプロバイダでログインする?」的なページを作成しておく。 使用するOpenIDプロバイダが1種類の場合は、このスクリプトでログインURLへリダイレクトさせても良いだろう。

app.yaml
- url: /_ah/login_required
  script: controllers.front.system.application
  secure: optional

ログインURLの取得

ログインURLは、以下の関数で取得できる。今回はドコモIDを使用する。federated_identityには各OpenIDプロバイダで指定されている OP Identifier を指定する。dest_urlにはログイン後に遷移するパスを指定しておく。

ログインURLの取得
from google.appengine.api import users

docomo_url = users.create_login_url( dest_url='/', federated_identity='https://i.mydocomo.com' )

XRDS文書の設置

ログイン時、OpenIDプロバイダによっては、アプリケーションサイト側に設置されたXRDS文書を参照しに来る。XRDS文書のパスは /_ah/xrds となっているため、app.yamlにスクリプトハンドラを設定しておく。今回はスクリプトにハンドリングしたが、静的ファイルとして設置しても問題ない。

app.yaml
- url: /_ah/(xrds|login_required)
  script: controllers.front.system.application
  secure: optional

返却するXRDS文書。これはOpenIDプロバイダによって公開されている。

返却するXRDS文書
<!--xml version="1.0" encoding="UTF-8"?--><br /> <xrds:XRDS xmlns:xrds="xri://$xrds" xmlns:openid="http://openid.net/xmlns/1.0" xmlns="xri://$xrd*($v*2.0)"><br /> <xrd><br /> <service priority="0"><br /> <type>http://specs.openid.net/auth/2.0/return_to</Type><br /> <uri>https://gcp-memo.appspot.com/</URI><br /> </Service><br /> </XRD><br /> </xrds:XRDS><br />

以上。

ログインURLにアクセスすると、ドコモ側のログイン画面が表示され、認証が必要なページにアクセスすることができる。

その他、mixi、Google、MySoftbankIDでも認証させることができた。

ただし、ドキュメント上OpenIDのサポートは「Experimental(実験的)」となっている。随分昔からこのままなので正式版にはならないかもしれない。そもそもOpenID自体がもうすでにオワコンな感じだけど。

コメント

このブログの人気の投稿

DatastoreとSerach APIを連携させる

Datastoreでは、複数のフィールドに対して不等式検索(!=や>など)やソートを行う場合、事前にIndexを構築しておく必要がある。しかも全ての検索条件の組み合わせごとにIndexが必要になるので、バックオフィス機能にありがちな複雑な条件での検索を行いたい場合、多くのIndexが必要だ。

Managed Virtual Machine に望むこと

先日2014年4月22日に行われた、Google Cloud Platformセッションの模様がYoutubeに公開されてた。 地方民はこういうイベントになかなか参加できないので、動画配信はほんとに助かる。ありがたや。。。 動画の中で語られている Managed VM は地味だけど、なにげにすごい機能だと思う。GAEでできなかったほとんどの事がこれで解決できるかもしれない。 ただ、個人的に Managed VMでは、(スケールアウトしなくていいので)固定IPも使えるようになってほしい。なぜなら、Google App Engineで外部のシステムと連携するとき、相手側でIPアドレス制限されている事がある。だから、連携前にあらかじめこちらのIPアドレスを教えておくのだけど、GAEはPaaSなのでその範囲も広いし、いつ変わるかわからない。まぁ、IPアドレス制限という方法自体がすでに時代遅れな感じではあるけど。 ともかく、GAEではそういうシステムと連携する時は、間にGAEでないサーバーを中継させておく必要がある。なので、このためだけにOSやApacheのメンテが発生する。これは、ほんとにアホらしいことだ。もし、Managed VMで固定IPが使えれば、対外部システムとの処理だけそのインスタンスで行えばいいし、中継サーバーも不要になるので、だいぶ楽になるのだ。 Googleさん、よろしくおねがいします。

BlobstoreUploadHandlerの文字化け問題の解決方法

Google App Engine Python2.7環境で、blobstore_handlers.BlobstoreUploadHandlerを使って、ファイルアップロードする際、日本語のリクエストパラメータが文字化けする問題に長年悩まされていた。 「文字化け」といっても、マルチバイト文字はBase64にエンコードされて送信される、という謎仕様。さらに、文字の組み合わせによっては Base64ではなく、Quoted-printable にエンコードされたりと、意味がわからない。。。 そんなわけで、ファイルとテキストは、別のリクエストに分けたりと、クライアント側で対処していた。 先日、この問題をGCPのサポートに問い合わせた結果、あっさりと対応方法を教えてくれた。 app.yamlに以下を追加すれば良いだけ。 libraries: - name: webob version: "1.2.3" なんと、WebObのバグだったようだ。 http://docs.webob.org/en/stable/changes.html#id25 GAEのPython2.7環境では、webobの1.1.1(かなり古い)がデフォルトらしく、1.2.3で解決されたこのbugfixのため、この対応で回避できる。という事らしい。 といっても、1.2.3もかなり前のバージョンなので、もっと上位のバージョンしても問題なさそうだけど、今回はこのバージョンで様子見で。。。 そろそろ、Goに移行しようかなぁ。。。