Google Apps + Federated Login

Google Apps SDK 1.3.4から、OpenIDによる認証がサポートされるようになった。
最近はKayFrameworkでアプリを作っているのだが、Kayは早くからOpenIDに対応してGoogle Marketplace用のアプリもサポートしていた。今回のSDKのバージョンアップでKayの独自実装は延期となり、新たな統合方法が検討されている。

現在開発しているアプリではGoogle Appsによるアカウント認証を行うためいろいろと調査した。認証方法にさほど変更はなく、create_user_loginメソッドに以下のパラメータが追加されている。

Function
The google.appengine.api.users package provides the following functions:
create_login_url(dest_url=None, _auth_domain=None, federated_identity=None)

_auth_domainとfederated_identityパラメータだ。(Federated Login周りの情報は現在英語版でしか提供されていない)

Google Appsでログインするには_auth_domain=None, federated_identity='Google Appsドメイン’でOKだ。(このあたりの情報はあまり出揃っていないようだ)
実際稼働させてみるとGoogleApssアカウントへの認証へ飛ばされる。もしAppsのロゴなども変更していればそれらも反映されている。

Kayにどうやって組み込もうかとあれこれ考えたが、やっぱり手っ取り早く@apps_login_requiredデコレータを自作することにした。
もともとのkay.auth.decorators.login_requiredのcreate_login_urlの部分を変更してOK。

さて、この時に認証先のドメインをどうやって取得するかが問題となった。

Google Market PlaceであればManifestのURLにドメインを組み込んでセットアップを行うのでその時に情報はあれこれ取得できるだろう。
今回開発しているアプリはMarketplace用ではなく、Google Appsドメイン追加でアプリを追加している。また独自ドメインエイリアスを設定している。

独自ドメインでAppsへ登録したなら、その情報を使えばいいじゃないかということでいろいろと調べた。環境変数のSERVER_NAMEでホスト名は取得できるが、そこからドメインを推測するのは避けたい。AUTH_DOMAINかと思って試したが、gmail.comからかわらず・・。

いろいろ試してようやく見つけることができた。
Google Apps Engineで作ったアプリを、Google Appsドメイン許可して登録すると以下の環境変数が追加される。

・HTTP_X_ZOO: 'app-id=アプリケーションID,domain=GoogleAppsドメイン'
・HTTP_X_GOOGLE_APPS_METADATA: 'domain=GoogleAppsドメイン

これらの環境変数独自ドメインでアプリにエイリアスを登録した時にのみ付与される。(appspot.comの場合は付与されない)
Federated Loginを使用した場合はその他にもFEDERATED_IDENTITYやFEDERATED_PROVIDERなども追加される。(DATACENTERなんていう変数も・・)

また、もうひとつの注意点としてFederated LoginでGooleAppsの管理者アカウントへログインした場合でも、is_current_user_admin()がTrueにはならない。あくまでアプリの管理者リストに登録されている場合にのみTrueが返される。(appspot.comの管理サイトで管理者リストにメールアドレスを登録する必要がある)


これで、AppsEngineで作ったアプリをドメイン追加でApps認証させることができるようになった。