RubyのGoogleDrive Gemを使ってGoogleDriveをさわろうとしたところ、OAuthの認証でつまづいたのでそのメモします。
OAuth2.0の流れはこんな感じです。
- ClientIDとClientSecretを発行する
- 認証する
- アクセストークンを取得する
- リフレッシュトークンからアクセストークンを再取得する
- 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になります。
https://accounts.google.com/o/oauth2/auth ?client_id=8972549879287.apps.googleusercontent.com &redirect_uri=http://localhost &scope=https://www.googleapis.com/auth/drive &response_type=code
この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を使います。全体として以下のようなものになります。
$ curl -d client_id=[YOUR CLIENT ID] -d client_secret=[YOUR CLIENT SECRET] -d redirect_uri=[YOUR REDIRECT URI] -d grant_type=authorization_code -d code=[YOUR AUTHORIZATION CODE] https://accounts.google.com/o/oauth2/token
結果として以下のようなJSONが返ってきます。
{
"access_token":"アクセストークン",
"token_type":"Bearer",
"expires_in":3600,
"refresh_token":"リフレッシュトークン"
}
アクセストークンがAPIを使用するための鍵になります。
リフレッシュトークンからアクセストークンを再取得する
アクセストークンには有効期限(expires_in)があるため、有効期限が切れた場合、リフレッシュトークンからアクセストークンを再取得する必要があります。
https://accounts.google.com/o/oauth2/tokenにPOSTで以下のパラメータを送ればアクセストークンを再取得出来ます。
- client_id:最初に発行したClientID
- client_secret:最初に発行したClientSecret
- refresh_token:リフレッシュトークン
- grant_type:”refresh_token”
全体として以下のようなものになります。
$ curl -d client_id=[YOUR CLIENT ID] -d client_secret=[YOUR CLIENT SECRET] -d refresh_token=[YOUR REFRESH TOKEN] -d grant_type=refresh_token https://accounts.google.com/o/oauth2/token
これでアクセストークンを取得したときと同じJSONが返ってきます。その中の access_tokenの値が新しいアクセストークンになります。
GoogleDrive gemを使ってみる
それではアクセストークン、リフレッシュトークンをゲットすることが出来たので最後にgemを使ってみましょう。 詳しいAPI仕様は公式ドキュメントを見てください。
CLIENT_ID = "9874987-ljk4j45n5dhh485014849.apps.googleusercontent.com"
CLIENT_SECRET = "98FZqeIdnz8495"
REFRESH_TOKEN = "5/Qzjrnxhtn;lUidZ"
client = OAuth2::Client.new(
CLIENT_ID, CLIENT_SECRET,
:site => "https://accounts.google.com",
:token_url => "/o/oauth2/token",
:authorize_url => "/o/oauth2/auth")
# refresh_tokenでログイン
auth_token = OAuth2::AccessToken.from_hash(client,{:refresh_token => REFRESH_TOKEN, :expires_at => 3600})
auth_token = auth_token.refresh!
# ログイン完了!
session = GoogleDrive.login_with_oauth(auth_token.token)
以上でログインが終わりました。
最後に
これでGoogleAPIを自由に使うことが出来ました。 ただ、GoogleDriveにはOAuth2.0認証を簡単に行うためのコードが実はあるのです!(最初からそれ使えよ) 1回手動で大きな流れを理解したあとであれば以下のコードも理解出来ると思います。
client = OAuth2::Client.new(
your_client_id, your_client_secret,
:site => "https://accounts.google.com",
:token_url => "/o/oauth2/token",
:authorize_url => "/o/oauth2/auth")
auth_url = client.auth_code.authorize_url(
:redirect_uri => "http://example.com/",
:scope =>
"https://docs.google.com/feeds/ " +
"https://docs.googleusercontent.com/ " +
"https://spreadsheets.google.com/feeds/")
# 表示されるURLをブラウザで開く
print auth_url
print "authorization code:"
authorization_code = gets.chomp
auth_token = client.auth_code.get_token(
authorization_code, :redirect_uri => "http://example.com/")
session = GoogleDrive.login_with_oauth(auth_token.token)
また、scopeで注意しなければならないこととしては、
- scopeを複数連ねる場合はURLの最後に半角スペースを挿入しなければならない
ということです。上記のRubyのコードでもよくみるとscopeのURLの最後に半角スペースが入っているのがわかると思います。 僕はここが理解出来ていなくて1時間くらい無駄にしました(´・ω・`)
ということでこれでもう忘れても大丈夫!お役に立てれば幸いです。
ある程度Rubyが出来るようになったらこれ。頑張ります。
アスキー・メディアワークス
売り上げランキング: 19,124
