AndroidからGoogle Service OAuth2.0の利用で詰んでいる

詰んでます。
この投稿は結局現状解決していません。
あしからず。

※2013/3/13追記
解決しました。
結局、「2.」の方法でうまくいきました。ただ、この記事を書いていたタイミングでは確かにICSでのみNPEが起きていたのですが、全く同じコードを今実行しても問題が再現しなくなっています。端末をフルリセットしてからも再現しないので、まぁ、大丈夫なんじゃないかと思います。というわけで、このケースは「2.」で対応しましょう。

----
Google Fusion Tables API v1を使いたい。今すぐ。
Google Fusion Tables API v1はprivateなデータにアクセスするのにOAuth2必須。(たぶん、他のGoogle Serviceも同様にOAuth2を標準的な認証方式としていく流れだと思います)
いろいろ調べた結果、OAuth2するためには、以下の4種類の方法があると考えている。
1. AndroidでGoogleのOAuth2認証を行うには?(外部ライブラリ完全非依存版)
2. AndroidのAccountManager経由でGoogleのOAuth2認証を行うには?(外部ライブラリ完全非依存版)
3. http://localhostなコールバックURLを処理する方法
4. ブラウザ上に表示された認証コードを手入力する方法

「1.」の方法はWebViewを使っている。
WebViewは本来的に脆弱性があるため、デリケートな認証情報を扱うOAuth2では利用しづらい。
Androidセキュリティ勉強会~WebViewの脆弱性編~
でも、海外では余裕で利用している。
Oauth 2.0 flow in Android
大丈夫?

「2.」の方法はICSだとGrantCredentialsPermissionActivityがNPEを起こすので利用できない。それより前のOSもしくはそれより後のOSでは発生しないらしい。しかし、ICS全盛の今ICSを無視するわけにはいかない。なのでアウト。

「3.」の方法は、仮にTwitterだったら
OAuthの認証にWebViewを使うのはやめよう
にあるように「getOAuthRequestToken 呼び出し時に Callback URL を指定します(なぜかこっちは独自スキーマが使える)」らしい。個人的にはTwitter APIの穴を突いたトリッキーな方法に見える。Googleはその辺は堅く、「http://localhost」固定。
これを何とかしようとすると、Android端末上にWebサーバが必要になるが、ポート80を一般のアプリケーションで待ち受けるのは制限されているためフレームワークに手を入れない限り不可能。というわけで、この方法もアウト。

「4.」の方法はブラウザに表示された認証コードをユーザに手でコピーしてもらって、認証処理を進める方法。桁数が多すぎるので、コピペしか考えられないのだが、迷わずこれが可能なユーザって今のスマフォユーザでどの程度いるだろうか。たぶん、サポートに問い合わせが殺到する。しかも、せっかく外部ブラウザを利用しても非ChromeのAndroid標準ブラウザで表示してしまったら元の木阿弥。というわけで、「1.」とレベルは一緒。

となると、消去法で「1.」が残る。。。
ユーザに脆弱性があることを理解してもらった上で利用してもらう、なんてバカな話があるだろうか。

とりあえず、誰かがうまい方法を考えてもらうまでサービスの作り込みをしようと思う。
個人的には、「3.」のCallback URLをHTTP以外のスキーマを解放するのが現実的だと思う。お願いしますGoogleさん。

コメント

  1. Google のドキュメント確認するとわかりますが、http://localhostのポートは80以外でも可能で、callbackにhttp://localhost:8080/callbackなどが指定出来ますよ。

    https://developers.google.com/accounts/docs/OAuth2InstalledApp#choosingredirecturi

    すでにご存知かもしれませんが一応。

    返信削除

コメントを投稿

このブログの人気の投稿

Execノードを使う

SendGridのX-SMTPAPIヘッダの使い方(Section Tags、Substitution Tags編)

Joinノードを使う(その4)