2014年5月9日金曜日

GoogleのOAuthをユーザ・インターフェースなしに突破する

Googleの認証って昔はクライアントログインと言って、ID/PASSを直接入れるというパターンがあったが、セキュリティ的にダメってことでいよいよそのAPIが使えなくなった。ユーザからはなんの認証もなくファイルをアップロードするけど、サーバ側のプログラムでは、僕のGoogleDriveに格納したいなんて要件はありがち。その場合には、まじめにOAuthというのを使わなくちゃいけない。だけどよくあるOAuthって、ログイン画面にブラウザ上でリダイレクトするんだけど、今回はサーバ側で「とあるアカウント」で無理やり認証したい。ということでその解説。


APIアクセスに必要なのはアクセストークン
一つ一つのAPIアクセスにはアクセストークンというのが必要。トークンってのはブラウザアクセスでいうセッションIDみたいなもん。ブラウザからWebサービス使うときにも裏の通信ってID/PASSを毎回送るんじゃなくて、セッションIDだけを送ることで、「さっきログインした私」であることを伝えている。アクセストークンもそういうもん。

じゃぁアクセストークンってどうやったら取れるの?
Twitterとかの連携アプリで、Twitterのログイン画面に戻ってきて、アプリを承認しますかって感じでTwitter側でのログインをすることで、トークンをもらうってのはよくある。だけど、今回やりたいのはユーザに認証画面を見せたくないのだ。

リフレッシュトークンというものがある
アクセストークンには寿命があるんだけど(Googleの場合は3600秒)、アクセストークンを再度取得するためのトークンがある。それがリフレッシュトークン。リフレッシュトークンの寿命は長い(じゃぁ、アクセストークンの寿命が長くてもいいじゃないって気はするがそこは受け入れるしかない)。ひとまずリフレッシュトークンをサーバ側のプログラムに埋め込めばしばらくは安泰ということだ。

リフレッシュトークンはどうやってもらうの?
認証コードってものを使ってGoogleの認証サーバにリクエストを出すともらえる。これは一度やれば良い作業なので手作業でOK。認証サーバはREST APIで動いているんだけど、プログラムにする必要もなくて、ターミナルから、curlでリクエストを出せばいい。

認証コードはどうやってもらえるの?
これは、普通にGoogleのログイン画面からブラウザを通じて認証コードをもらう。
https://accounts.google.com/o/oauth2/auth
ってところに、以下の情報を渡す

  • クライアントID
  • クライアントシークレット

クライアントIDとクライアントシークレットはどこでもらえるの?
これはGoogleのデベロッパーコンソールの画面から発行してもらう。クライアントIDとクライアントシークレットは、APIにとってのID/PASSみたいなもん。API使っていて万が一これらの情報が漏れたとしても、クライアントIDの単位で削除もできる(Googleのアカウントは削除されない)。

ということで一杯あるけどまとめ。

  • アクセストークン(Access Token)
    • セッションみたいなもの
    • APIアクセスの時には必ず必要
  • リフレッシュトークン(Refresh Token)
    • アクセストークンをプログラムから自動取得するためのトークン
  • 認証コード(Authorization Code)
    • Google側でログインするともらえるコード
    • よくあるOAuthは認証コードがクエリストリングについて、自分サイトにリダイレクトするんだけど、サーバ側だけで完結させたいときには、認証コードを手でコピペして、リフレッシュトークンをもらう
    • CODEって名前で出てくるから超ややこしい
  • クライアントID/クライアントシークレット
    • デベロッパーコンソールの画面上で取得する。APIのためのID/PASSみたいなもんだと思えばいい
    • アクセストークンをもらうまでのAPIアクセスには、クライアントIDとクライアントシークレットが必要
以上の実際の作業は、こちら
に書かれているので、これをコピペすればOK。

あと、認証周りは、ライブラリもあるんだけど、一つ一つは単なるRESTのAPIなので、curlで手作業でひと通り触ってみると、すごく分かりやすいし、問題が起きた時のデバッグも楽。

0 件のコメント:

コメントを投稿