家族ToDo(仮)開発日誌

やりたいことや行きたい場所を家族で共有するためのAndoridアプリの開発日誌(兼Android開発学習メモ)です。

開発日誌 (7) : scribeでGoogle OAuth 2.0 (client_secretなしで認証)

今回の進捗

  • Google OAuth 2.0対応のscribeを入手、ビルド (client_secretが空文字列でもOKに修正)
  • カスタムスキーマなCallback URLをうまく扱ってくれない件について調査。http://localhostしかない?

作業時間: 3h

Google OAuth 2.0対応のscribeでやりなおし

GoogleのOAuth 2.0がらみの記事を読みあさっていて気づいたのだが、そもそも、今まで使っていた本家のscribeに組み込まれているAuthorization URLはなんか古かった。つまりOAuth 1.xを使っていた。というわけで本家のFork ListからGoogleのOAuth 2.0に対応したよさげなForkを選択。

Kobee1203/scribe-java · GitHub

残念ながらバイナリの配布がなさそうなので、 とりあえず全ソースを取得、Netbeansにインポートしたらボタン一つでビルドできた。できあがったjarをAndroid Studioにインポート。

いままでServiceBuilder.providerメソッドに与えていたGoogleApiクラスをGoogleApi20クラスに変更。これでうまくいくかと思いきやUnsupportedOperationExceptionが発生。どうやらscribeでは1.0と2.0でお作法が異なる模様。

java - How can I use Scribe with a not-yet implemented Api? - Stack Overflow

下記サンプルを見ると、getRequestTokenは使わず、いきなりgetAuthorizationUrlを呼んでいたりする。サンプルを参考に処理を書き換え。

scribe-java/src/test/java/org/scribe/examples/GoogleExample20.java at master · bistri/scribe-java · GitHub

これでいけると思いきや、secretKeyが空文字であることが災いして、scribeのチェック処理で死ぬ。どうやらscribeはsecretKeyが必須の前提で作られている模様。仕方が無いのでNetbeansで当該チェック処理をコメントアウトして再ビルド、うまく通るようになった。

カスタムCallbackURLが使えない

Intent Filterの設定もしているのに、うまくアプリに戻ってくれない。適当に調べた感じでは、OAuth 2.0では非標準なスキーマは使えなくなったようだ。うへ。

iOS向けでは下記のようにすることもできるようだが・・。

Naveen Agarwal - Google+ - How to use custom URI schemes in the redirect URI for… https://plus.google.com/+NaveenAgarwal/posts/AztHNnQh7w6

残念ながら、Androidでうまくいかない。どうやらデフォルトのCallback URLであるhttp://localhostを使用する以外に無いようだ。しかしhttpはブラウザに割り当てられているのでアプリ選択ダイアログが出てしまう。

StackOverflowの下記トピックでは、結論としてWebViewを使うことにしたとのこと。うーん。もともとアプリ組み込みのフォームではユーザに安心感を与えられないので標準ブラウザを使う方法を探したという経緯があったのだが・・。

Best way to use Google APIs using OAuth 2.0 on Android - Stack Overflow http://stackoverflow.com/questions/6966965/best-way-to-use-google-apis-using-oauth-2-0-on-android

もう少し追跡調査をしてみるつもりだが、現状これは致し方がないのかもしれない。AndroidだけならAccountManagerをつかえという話なのかも。

次回へ続く。