OpenID Connect for Android App

こんばんは、ritouです。

OpenID ConnectはOAuth 2.0ベースなので、OAuth 2.0のClientが動作する環境であればどこでもOpenID Connectをできるはずです。
AndroidアプリでOpenID Connectを導入したい!」って思ったときに昔話を思い出して「あれ?OpenIDってWebだけのしくみだっけ?じゃあダメか」とか言われないように試しに作ってみました。ログインさせるだけで良いかなと思ったので、とりあえずTitanium Studioで作りました。
ここではざっくり何やってるかを説明していきます。

1. OP特定のための識別子入力 + DIscovery + Dynamic Client Registration

まずはユーザーがOPの識別子なり、メールアドレスなり、それにつながってる自分のドメインを入力します。

この後、このアプリ自体がDiscoveryしてDynamic Client Registrationをする必要があります。
Webサーバー上のRPの場合、どこかにOP情報とClient Credentialをキャッシュしておいてそれを参照して次のリクエストを作成するところです。
しかし、各Android単位でそれをやっていると一つのOPについてアプリをインストールした人の数だけClient登録しまくりになってしまいます。
Discovery, Dynamic Client Registrationの処理とClient Credentialの管理をするWebサーバーを用意しました。
アプリはユーザーが入力した識別子をそのサーバに送り、OPの情報とClient Credentialを受け取る簡単な仕事だけしています。


2. AuthZ URL作成+ブラウザによって立ち上げ

次は受け取ったOPのAuthorization Endpointに各種パラメータをつけたURLを作成し、外部のブラウザを立ち上げます。

openidconnect.info を入力すると、OPの画面が表示されます。
ちなみにAndroid対応なんてしていないので見にくいですね。
mixiアカウントでログインすると、同意画面になります。

ここでAllowを押すと次に進みます。

3. カスタムURIスキームを使ってブラウザからアプリ起動!

WebサーバーなRPの場合、redirect_uriパラメータはhttps://なんとかかんとかになりますね。
でも、今回は"oidconnect://demorp/"というのを指定しています。
AndroidManifest.xmlにはこんな記述をしています。

よって、OPがなんとかしてこの文字列にリダイレクトしてくれたらアプリが立ち上がります。

4. ID Tokenの内容とUserInfoを取得して出力

今回はresponse_type=token%20id_tokenを使っているので、フラグメント識別子access_tokenとid_tokenが返ってきます。
アプリはそれを用いてUserInfo EndpointとCheck ID Endpointに投げるとユーザー情報とログイン情報が取得できますね。


メニューにログアウトを用意しておいたので、押すと最初からやり直しができます。
お疲れ様でしたー!

いや、何やってるか分からない

今までのを図にするとこんな感じです。


試してみたい方は

ここに野良apkファイルが!
https://openidconnect.info/images/CONNECTDEMORP.apk

PCでダウンロードしてから自分でつっこんでやれば動くと思います。

注:信用できないアプリはインストールしてはいけません!
上記の通り、APIアクセスを3回、ブラウザ起動を1回ほどやっています。
今話題の端末の識別子的なものなどは送っておりませんが、あくまで自己責任でどうぞ。

ではまた!