Google APIのaccess tokenを取得する

Google APIaccess tokenを取得する

ちょっと前にMicrosoft Officeの認証について調べたんですが、今度はGoogle API。こっちはOAuth2ってな手順らしいです。
ホントややこしい。
やりたかったのは動画メディアの自動アップロードなので、利用するAPIGoogle Photoのものです。

手順としては以下の通り。

  • GoogleAPIのコンソールでプロジェクトを作るか、既存プロジェクトを選択
  • そのプロジェクトでGoogle Photos APIを有効にする。
  • 認証情報メニューからクライアントIDを作成。
  • 作成したクライアントIDを使って、認証コードを取得
  • 上記認証コードを使ってaccess tokenとrefresh tokenを取得

具体的に。

GoogleAPIのコンソールからプロジェクトを作成

GoogleAPIコンソールへログインして、「APIとサービス」から新しいプロジェクトを作成。
もちろん既存プロジェクトを選択しても可。

f:id:rougeref:20200512133102p:plain

Google Photos APIを有効にする

同じ画面の上部に「APIとサービスを検索します」と薄くでている検索窓があるので、ここに"Google Photos Librarly API"といれて検索。
見つかったやつをクリックして、右上の「有効化」をクリック。

クライアントIDを作成

右側のスロット「認証情報」をクリックして、右側上部の「+認証情報を作成」をクリック。プルダウンが表示されるので、「OAuthクライアントID」を選択。
アプリケーションの種類は「デスクトップアプリ」を選択、名前はなにか適当に入力して「作成」をクリック。
"OAuthクライアントを作成しました"というダイアログがでてきて、クライアントIDとクライアントシークレットが表示されますが、これはコンソールからいつでも参照できるのでいまは無視して「OK」をクリック。

f:id:rougeref:20200512133805p:plain

作成したクライアントIDを使って認証コードを取得する。

こんなURIへブラウザからリクエストを出します。

https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=$CLIENT_ID&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https://www.googleapis.com/auth/photoslibrary&access_type=offline

$CLIENT_IDのところを前ステップで作成したOAuthクライアントIDのクライアントIDをへ置き換えます。以下の画像の赤で囲ったところの値です。

f:id:rougeref:20200512134724p:plain

scope=以下のところが、Google Photoで使いますよっていうスコープ。このあたり詳細は
developers.google.comこちらを参照。
ブラウザでリクエストするとこんな画面が出てきます。認証を行うユーザ名を選択するか入力。
f:id:rougeref:20200512135109p:plain

で、本来ならこの認証はGoogle様に承認を貰わないといけないようで「このアプリは確認されていません」とかってワーニング画面がでます。
無視して続行。すると、当該アプリへ権限を付与していいかってダイアログがでてきますので、「許可」をクリック。

f:id:rougeref:20200512135413p:plain
もういちど確認画面がでてくるので「許可」をクリック。すると認証コードが表示されます。
こんな感じ。

f:id:rougeref:20200512135544p:plain

access tokenとrefresh tokenを取得

ようやく欲しかったものが入手できる。curlでリクエストを投げますが必要な変数が以下。いちいちタイプするわけにも行かないのでシェル変数へ突っ込むのが吉。

  • さっき入手した認証コード
  • クライアントID
  • クライアントシークレット
  • リダイレクトURI(これは固定値だな)

変数へ突っ込んでcurlでdataで渡す。

$ AUTHORIZATION_CODE="xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
$ CLIENT_ID="sdfasadfaserweirusdfafdsa.apps.googleusercontent.com"
$ CLIENT_SECRET="sdfjlajdfalfdjsaljfals"
$ REDIRECT_URI="urn:ietf:wg:oauth:2.0:oob" 
$ curl --data "code=$AUTHORIZATION_CODE" --data "client_id=$CLIENT_ID" --data "client_secret=$CLIENT_SECRET" --data "redirect_uri=$REDIRECT_URI" --data "grant_type=authorization_code" --data "access_type=offline" https://www.googleapis.com/oauth2/v4/token
{
  "access_token": "xxxxxxxxxxxxxxxxxxxxxxxx(略",
  "expires_in": 3599,
  "refresh_token": "yyxxxxxxxxxx(略",
  "scope": "https://www.googleapis.com/auth/photoslibrary",
  "token_type": "Bearer"
}

access tokenなどがjsonで帰ってきます。レスポンスの通り、tokenは1時間(3600秒)しか有効じゃないので、実際にAPIを呼び出すときにはrefresh tokenを使ってaccess tokenを再取得するのがいいみたい。

$ REFRESH_TOKEN=zzzzzzzzzzzzzzzzzzzzzzzzzzzzz
$ curl -s --data "refresh_token=$REFRESH_TOKEN" --data "client_id=$CLIENT_ID" --data "client_secret=$CLIENT_SECRET" --data "grant_type=refresh_token" https://www.googleapis.com/oauth2/v4/token