RubyでGoogleDrive APIを使用するためにアクセストークンを取得する


RubyのGoogleDrive Gemを使ってGoogleDriveをさわろうとしたところ、OAuthの認証でつまづいたのでそのメモします。

OAuth2.0の流れはこんな感じです。

  1. ClientIDとClientSecretを発行する
  2. 認証する
  3. アクセストークンを取得する
  4. リフレッシュトークンからアクセストークンを再取得する
  5. GoogleDrive gemを使ってみる

ClientIDとClientSecretを発行する

まずはプロジェクトを作成します。
https://cloud.google.com/console/project

APIsから「Drive API」と「Drive SDK」をONにします。

「Credentials」から「CREATE NEW CLIENT ID」から今回のプログラムで使う必要項目を取得します。

以上のような項目を選択

これでClientIDとClientSecretが作成されました。

認証する

ユーザーがAPIアクセスの許可を行い、Authorization codeを取得します。
これにはhttps://accounts.google.com/o/oauth2/authに以下のパラメータを付与したものにブラウザからアクセスします。

  • client_id:さきほど発行したClientID
  • redirect_uri:さきほど発行したRedirectURIs
  • scope:今回はGoogleDriveを使いたいので https://www.googleapis.com/auth/drive
  • response_type:”code”

よって以下のようなURLになります。

このURLにアクセスすると認証画面になるので承認してください。
redirect_uriに設定したURLにcodeパラメータがついています。それがAuthorization codeになります。

アクセストークンを取得する

Authorization codeからアクセストークンを取得します。
https://accounts.google.com/o/oauth2/token にPOSTで以下のパラメータを送る必要があります。

  • client_id:最初に発行したClientID
  • client_secret:最初に発行したClientSecret
  • redirect_uri:最初に発行したRedirect URIs
  • grant_type: “authorization_code”
  • code: Authorization codeの値

POSTとして送るためcurlを使います。全体として以下のようなものになります。

結果として以下のようなJSONが返ってきます。

アクセストークンがAPIを使用するための鍵になります。

リフレッシュトークンからアクセストークンを再取得する

アクセストークンには有効期限(expires_in)があるため、有効期限が切れた場合、リフレッシュトークンからアクセストークンを再取得する必要があります。

https://accounts.google.com/o/oauth2/tokenにPOSTで以下のパラメータを送ればアクセストークンを再取得出来ます。

  • client_id:最初に発行したClientID
  • client_secret:最初に発行したClientSecret
  • refresh_token:リフレッシュトークン
  • grant_type:”refresh_token”

全体として以下のようなものになります。

これでアクセストークンを取得したときと同じJSONが返ってきます。その中のaccess_tokenの値が新しいアクセストークンになります。

GoogleDrive gemを使ってみる

それではアクセストークン、リフレッシュトークンをゲットすることが出来たので最後にgemを使ってみましょう。
詳しいAPI仕様は公式ドキュメントを見てください。

以上でログインが終わりました。

最後に

これでGoogleAPIを自由に使うことが出来ました。
ただ、GoogleDriveにはOAuth2.0認証を簡単に行うためのコードが実はあるのです!(最初からそれ使えよ)
1回手動で大きな流れを理解したあとであれば以下のコードも理解出来ると思います。

また、scopeで注意しなければならないこととしては、

  • scopeを複数連ねる場合はURLの最後に半角スペースを挿入しなければならない

ということです。上記のRubyのコードでもよくみるとscopeのURLの最後に半角スペースが入っているのがわかると思います。
僕はここが理解出来ていなくて1時間くらい無駄にしました(´・ω・`)

ということでこれでもう忘れても大丈夫!お役に立てれば幸いです。

ある程度Rubyが出来るようになったらこれ。頑張ります。

メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス
売り上げランキング: 19,124

更新情報はFacebookページで!

ブログの更新、読んで役立つ他ブログの記事などを更新しています。




関連のある記事


質問があればこちらからどうぞ

カテゴリーRuby

コメントを残す

メールアドレスが公開されることはありません。


*