Google APIのaccess tokenを取得する
Google APIのaccess tokenを取得する
ちょっと前にMicrosoft Officeの認証について調べたんですが、今度はGoogle API。こっちはOAuth2ってな手順らしいです。
ホントややこしい。
やりたかったのは動画メディアの自動アップロードなので、利用するAPIはGoogle Photoのものです。
手順としては以下の通り。
- GoogleAPIのコンソールでプロジェクトを作るか、既存プロジェクトを選択
- そのプロジェクトでGoogle Photos APIを有効にする。
- 認証情報メニューからクライアントIDを作成。
- 作成したクライアントIDを使って、認証コードを取得
- 上記認証コードを使ってaccess tokenとrefresh tokenを取得
具体的に。
Google Photos APIを有効にする
同じ画面の上部に「APIとサービスを検索します」と薄くでている検索窓があるので、ここに"Google Photos Librarly API"といれて検索。
見つかったやつをクリックして、右上の「有効化」をクリック。
クライアントIDを作成
右側のスロット「認証情報」をクリックして、右側上部の「+認証情報を作成」をクリック。プルダウンが表示されるので、「OAuthクライアントID」を選択。
アプリケーションの種類は「デスクトップアプリ」を選択、名前はなにか適当に入力して「作成」をクリック。
"OAuthクライアントを作成しました"というダイアログがでてきて、クライアントIDとクライアントシークレットが表示されますが、これはコンソールからいつでも参照できるのでいまは無視して「OK」をクリック。
作成したクライアントIDを使って認証コードを取得する。
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をへ置き換えます。以下の画像の赤で囲ったところの値です。
scope=以下のところが、Google Photoで使いますよっていうスコープ。このあたり詳細は
developers.google.comこちらを参照。
ブラウザでリクエストするとこんな画面が出てきます。認証を行うユーザ名を選択するか入力。
で、本来ならこの認証はGoogle様に承認を貰わないといけないようで「このアプリは確認されていません」とかってワーニング画面がでます。
無視して続行。すると、当該アプリへ権限を付与していいかってダイアログがでてきますので、「許可」をクリック。
もういちど確認画面がでてくるので「許可」をクリック。すると認証コードが表示されます。
こんな感じ。
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