前回の記事から間が空いてしまったが、外部認証サービスについて書いていきたい。
今回は App Engine SDK 1.3.4 から提供されるようになった OpenID API について解説する。
まず Google がこの機能を解説しているので、興味ある人は下のリンクのサイト記事を読んで欲しい。日本語のサイトには無く、英語だけの情報提供だ。
参考: Using Federated Authentication via OpenID in Google App Engine
解説通り、サンプルプログラムを使って実行すれば、OpenID 認証を利用したアプリケーションが動く・・・・。しかしこのままでは、この記事が終わってしまうので、要点及び注意点について解説していく。
OpenID API の設定
OpenID API の設定は次の手順で行う。
- App Engine の認証オプション設定を Google Accounts API から Federated Login に変更する。
App Engine 管理画面から、[Application Setting] をクリックする。
[Authentication Options] を [Federated Login] に変更して、[Save Settings] ボタンを押す。 - 認証を必要とするようにアプリケーションの設定を行う。
アプリケーションが認証を要求するように設定する必要がある。Google App Engine(GAE) では簡便な方法が用意されている。app.yaml の認証を必要とする URLパターン・スクリプトハンドラの下に login: required と記述する方法である。
- url: .* script: main.py login: required
Googleのサンプルプログラムのように GET関数内に自分で認証要求を書く方法もある。この場合、app.yaml 内に login: required を設定すると動かなくなる。
この他にユーティリティ関数として google.appengine.ext.webapp.util に @login_required がある。認証を必要とする関数の直前に記述して、デコレータとして動かすものだ。しかしこれはGoogleアカウントにしか対応していなく OpenID では(現在のところ)利用できないようである。
- 認証するためのコードを用意する
OpenID認証をするためのコードを用意する必要がある。ログイン用に create_login_url() という関数が用意されておりOpenIDのURLをパラメータで渡すと、ログイン用のURLを生成する。
users.create_login_url(federated_identity='yahoo.com')
すると次のURLを吐き出す。http://(アプリURL)/_ah/login_redir?claimid=yahoo.com&continue=http://(アプリURL)
このURLを画面に出力しクリックしてもらうか、リダイレクトすることによりOpenID認証を行う。
create_login_url 関数には dest_url パラメータもあり、このパラメータを設定すると認証後の遷移先を指定できる。ログインだけでなくログアウト関数もあり、同様に URL を吐き出す。
users.create_logout_url(self.request.uri)
create_logout_url では、ログアウト後の遷移先をパラメータにする。 app.yaml で login: required を設定した場合は、/_ah/openid_login というURLに対して認証用のコードを割り当てる必要がある。- url: /_ah/login_required script: do_openid_login.py
手順としては以上である。非常に簡単である。Google も Googleアカウント認証を使用しているアプリケーションは、容易に OpenID 認証に変更できると言っているようである。
OpenIDの仕様と考慮すべき点
最後に OpenID の仕様に絡む問題について書いてみる。
OpenIDには 1.1 、2.0 といった仕様が存在する。OpenID1.1 認証では、ユーザが OpenID URL を入力して認証させる必要があった。OpenID2.0 からは新しく User-Supplied Identifier(ユーザ入力識別子)が導入された。これによって何が変わるか、次の図を見て欲しい。
①の方法は従来方式なのだが、長いURLを入力する必要があった。OpenID2.0でサポートされている入力方式(②)ではプロバイダー画面に遷移してから入力するので、ユーザにとっては操作が簡単で安心である。
仕様が複数あるため、プロバイダーによってサポートしている仕様が違うことになる。日本のプロバイダーでいえば、「はてな」は①の方式だが「mixi」は②の方式をサポートしている。このため認証用のコードを書くときは、サポートするプロバイダーによって処理方式を切り替える必要がある。
今回の記事はここまでだが、次回以降にもうちょっと実用的な説明をしていきたいと思う。
参考
アットマーク OpenIDの仕様と技術
OpenIDファウンデーション・ジャパン