ここ最近はGmailに搭載された OAuth認証のうちの anonymous 方式のほうを調べて試行錯誤していました。
AndroidでGmailを使っているので、そのアプリに生かせたらいいなというのが最終目標です。日本語で、そしてJavaでの資料が思いの外少なくて、苦労しました。
いろいろ実験してうまくいかなくて、苦労していましたが、最終的には単純にOAuthの認証パラメータが不足していたことが原因でした。抜けていたのは、 oauth_signature という項目。これがリクエスト後のパラメータ集合になく、ハッシュ値を計算した後で自分で追加してあげなければいけなかったようです。これを適用してあげることでGmailのImapの認証が通ることを確認できました。
さて、いろいろとやってたわけですが、ここまでの道のりを書いてみます。
OAuth認証とは
最近はやってきている認証方式です。ある認証システムがユーザー認証を行い、その他のサービスらはその認証結果を使用させてもらう、という感じのものです。認証システムが1カ所になる点と、その際にパスワードの転送をしなくてよいというのが、割とセキュアになっているのでよさそうなシステムです。
ここで認証システムは”ユーザーを認証”という点から少しずれて、 何らかのデータへのアクセスへの承認、という部分を制御します。実際には外部サービスの利用時にユーザーにその許可の有無を問い合わせを行います。承認されれば、次回からそのサービスは認可されている範囲でデータにアクセスすることが可能になります。
ここで、パスワードのやりとりを行わずに何らかのデータ列(キーデータ)のやりとりでこれを実現していることがポイントです。
仕組みを理解するために
いくつかのサイトで方式を勉強しました。
- 技術評論社の ゼロから学ぶOAuth
- @ITのOAuth 2.0でWebサービスの利用方法はどう変わるか
- OAuth Playground
特に、OAuth Playgroundはある程度の仕組みをざっとわかった後で、試してみると動作を実感できるのでお勧めです。ほかのサイトの説明を見ながら、このサイトで動作をさせてみながら、理解しようとするとわかりやすくなってよいかと思います。
うまくいかないときに
いくらやってみてもうまくいかなかった点として、GmailがIMAP/SMTPで取り入れているOAuthの認証では、anonymous方式をとっています。これは、従来のOAuthでConsumerキーとして使っている部分に”anonymous”を設定する方式です。この点がまず違います。
あと、強引に何度も試行錯誤しているとGmailのシステムからアカウントのロックを適用されてしまう可能性があります。この場合には、そのアカウントロックを解除しなくてはなりません。
さらに、うまくいくケースを見つけて、うまくいかない場合とどう違うのかを比較してみることが大切かと思います。
今回ずっとAndroid端末で実験していましたがうまくいかなくて、あきらめてPCベースのプログラムを作成し、googleのサンプルコードを動かしてみました。この両者を比較して、oauth_signatureのパラメータ抜けに気づきました。
それ以外の部分では、GmailのIMAP/SMTPを説明しているページをじっくり読むことが大切だったなと思います。