Google APIを使用するためにGoogle OAuth認証をしようよ

Google Calendar APIやGoogle Analytics API,Gmail,プロフィール,などなど
これらのGoogleサービスを使用するにあたって最初に必要になるのがOAuth認証。
面倒そうだけどやってみると割と簡単にできます。

APIを使用するときに大抵Headerにこんなやつを書きます。
Authorization: Bearer <トークン>
これを取得するまでの記事になります。

SFDCで連携しなければいけなくなったというのと
今後Google大先生との連携が多くなると思うのでOAuth認証方法をメモっときます。

この手順を理解すればどんなアプリにでも組み込みやすくなると思います。

Google OAuth認証の体験ができるツールを作りました。↓
Google OAuth 認証を簡単に実行してトークンを取得するツールを作った

準備

  • Postman
    • OS問わず使用できるcurlツールなのでこれをインストールしてください。

大まかな流れ

  • Google API Console で<クライアントID>と<クライアントシークレット>の取得
  • Google OAuth URLから<コード>を取得
  • Google Token URLから<トークン>と<リフレッシュトークン>を取得
  • 番外編 <リフレッシュトークン>を使用して<トークン>を更新

※リフレッシュトークンがあればいちいち許可画面に行かなくてもトークンを更新できるようになります。

手順

1. Google API Console で<クライアントID>と<クライアントシークレット>の取得

Google projectを作成します。

Google認証画面を設定します。
個人のGoogle APIしか使わない人は自身のGmailを選択しておきます。
メールアドレスをG Suiteのグループにしておけばグループの人がこのGoogle APIでの設定が必要なくなるわけですね。
サービス名は必須なので適当に入力します。

Google 認証情報を追加します。
ここの<リダイレクトURI>はまた必要になるのでメモしておいてください。

保存をすると<クライアントID>と<クライアントシークレット>を取得できます。

2. Google OAuth URLから<コード>を取得

OAuth URLを作成して許可画面で許可して<コード>を取得します。

https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=<クライアントID>&redirect_uri=<リダイレクトURI>&scope=<スコープ>&access_type=offline&approval_prompt=force

<スコープ>とはどのGoogle APIのアクセスを許可するかというもの。
<スコープ>は以下の表を参考にURLを作成してみてください。

内容 scope
Gmail API https://mail.google.com/
Google Analytics API https://www.googleapis.com/auth/analytics
Calendar API https://www.googleapis.com/auth/calendar
YouTube Data API https://www.googleapis.com/auth/youtube
Sites API https://sites.google.com/feeds/
プロフィール情報 profile
メールアドレス email

他のAPIも使いたいぞという人はこちら

複数のスコープを使用する場合は%20で結合してください。

例)https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=<クライアントID>&redirect_uri=<リダイレクトURI>&scope=https://mail.google.com/%20https://www.googleapis.com/auth/calendar&access_type=offline&access_type=offline&approval_prompt=force

上記方法でURLを作成後に遷移してください。
許可画面が出てくるので許可してください。

許可後は<リダイレクトURI>に設定されたページに遷移します。
このcodeというパラメータが<コード>になります。

3. Google Token URLから<トークン>と<リフレッシュトークン>を取得

以下の通りに今まで取得した内容をPostmanでPOSTしてみます。

https://www.googleapis.com/oauth2/v4/token
Content-Type:application/x-www-form-urlencoded


code:<コード>
client_id:<クライアントID>
client_secret:<クライアントシークレット>
redirect_uri:<リダイレクトURI>
grant_type:authorization_code
access_type:offline

上記をPOSTすると以下の結果が返ってきます。


{
"access_token": <トークン>,
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": <リフレッシュトークン>
}

※注意※
ここでPOSTを2回行うと以下のエラーが発生します。
その際は再度<コード>を取得してください。
{
"error": "invalid_grant",
"error_description": "Code was already redeemed."
}

<トークン>の有効期限は1時間です。
<リフレッシュトークン>の有効期限はありません。ただし以下の条件を満たすと無効になります。
* 認証情報を削除すると無効になります。
* 6ヶ月<リフレッシュトークン>を使用しないと無効になります。
* <スコープ>にGmailが含まれている時パスワードを変更すると無効になります。
* <リフレッシュトークン>を50件以上作成すると古い順から無効になります。

これで手順は終了です。
あとはAuthorization: Bearer <トークン>を使用して色々なAPIを使ってみましょう!

番外編 <リフレッシュトークン>を使用して<トークン>を更新

POST
https://www.googleapis.com/oauth2/v4/token

Header
Content-Type:application/x-www-form-urlencoded

Body x-www-form-urlencoded
refresh_token:<リフレッシュトークン>
client_id:<クライアントID>
client_secret:<クライアントシークレット>
grant_type:refresh_token

上記内容をPOSTすると

{
"access_token": <トークン>,
"token_type": "Bearer",
"expires_in": 3600
}

<トークン>が取得できましたね。

あとがき

久しぶりにちゃんとした記事書いた。

参考

Google APIのAccess Tokenをお手軽に取得する
Google OAuth2 Web Server Profileでのリフレッシュトークン

OAuth 2.0 Scopes for Google APIs

Google Token expiration

スポンサードリンク