2011年3月30日水曜日

外部認証を使ったアプリケーション③ Google OpenID API

前回の記事から間が空いてしまったが、外部認証サービスについて書いていきたい。
今回は App Engine SDK 1.3.4 から提供されるようになった OpenID API について解説する。

まず Google がこの機能を解説しているので、興味ある人は下のリンクのサイト記事を読んで欲しい。日本語のサイトには無く、英語だけの情報提供だ。

参考: Using Federated Authentication via OpenID in Google App Engine

解説通り、サンプルプログラムを使って実行すれば、OpenID 認証を利用したアプリケーションが動く・・・・。しかしこのままでは、この記事が終わってしまうので、要点及び注意点について解説していく。

OpenID API の設定

OpenID API の設定は次の手順で行う。

  1. App Engine の認証オプション設定を Google Accounts API から Federated Login に変更する。

    App Engine 管理画面から、[Application Setting] をクリックする。

    [Authentication Options] を [Federated Login] に変更して、[Save Settings] ボタンを押す。

  2. 認証を必要とするようにアプリケーションの設定を行う。

    アプリケーションが認証を要求するように設定する必要がある。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 では(現在のところ)利用できないようである。

  3. 認証するためのコードを用意する

    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ファウンデーション・ジャパン