【備忘録】Google Translation APIをリフレッシュトークンを使ってアプリケーションから利用するまでの手順


はじめに

たまにOAuth2を使ってGCPのAPIを呼び出すことがあるのですが、手順をすぐ忘れる上に、新たに調べると毎回とても苦労します。
そこで未来の自分のために手順書を書くことにしました。
今回はGoogle Translation APIを呼び出しましたが、ほかのAPIでも応用できます。
実行環境はMacです。

今回やりたいこと

アプリケーションからGoogle Translation APIを呼び出して、日本語の商品名を英語に翻訳して表示します。
APIを呼び出す際に使うアクセストークンは時間が経つと失効してしまうので、リフレッシュトークンを使って毎回アクセストークンを新たに取得します。

手順

基本的にはこちらの記事を参考にしています。

Google APIのAccess Tokenをお手軽に取得する
https://qiita.com/shin1ogawa/items/49a076f62e5f17f18fe5

APIを有効にする

GCPのコンソールにアクセスし、APIとサービス→ライブラリを開きます。
使用したいAPIを検索し、APIを有効にします。

OAuth2.0 クライアントIDを作成する

GCPのコンソールでAPIとサービス→認証情報を開きます。
初めてクライアントIDを作成する場合はOAuth同意画面の入力が必要になるので、事前にアプリケーション名を入力して保存しておきます。

認証情報を作成→OAuthクライアントIDを選択します。

アプリケーションの種類を選択し(今回は「その他」)、名前を入力して作成します。

表示されたクライアントIDとクライアントシークレットを環境変数に設定します。

export CLIENT_ID=...
export CLIENT_SECRET=...

環境変数に設定する理由:この後、何度もcurlコマンドを実行しますが、これらの値を環境変数に設定しておくことで、この記事に記載されたコマンドをそのままコピペして実行することができます。

リダイレクトURIの設定

今回はデスクトップアプリケーションから呼び出すのでリダイレクトURIは固定値 urn:ietf:wg:oauth:2.0:oobとなります。
WEBアプリの場合は認証結果がリダイレクトされるURIを設定します。

export REDIRECT_URI=urn:ietf:wg:oauth:2.0:oob

スコープの設定

スコープに設定する値は以下のURLから調べることができます。

今回はhttps://www.googleapis.com/auth/cloud-translationを設定します。
設定すべきスコープが複数ある場合は%20(空白をWEBエンコードしたもの)でつないで記述します。

export SCOPE=https://www.googleapis.com/auth/cloud-translation

認可画面のURLを生成し、Authorization Codeを取得する

以下のコマンドを実行し、表示されたURLをブラウザに貼り付けて表示します。

echo "https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=$CLIENT_ID&redirect_uri=$REDIRECT_URI&scope=$SCOPE&access_type=offline"

ログインして許可をクリックするとAuthorization Codeが表示されるので環境変数に設定します。

export AUTHORIZATION_CODE=...

Authorization Codeを利用してリフレッシュトークンを取得

以下のcurlコマンドを実行します。

curl -X POST --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

実行結果からリフレッシュトークンを環境変数に設定します。

export REFRESH_TOKEN=...

リフレッシュトークンを利用してアクセストークンを取得

以下のcurlコマンドを実行します。

curl -X POST --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

取得したアクセストークンを環境変数に設定します。

export ACCESS_TOKEN=...

動作確認

以下のcurlコマンドを実行します。

curl -X POST -H "Content-Type: application/json" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
--data "{ \
  'q': '翻訳したい商品名', \
  'source': 'ja', \
  'target': 'en', \
  'format': 'text' \
}" \
https://translation.googleapis.com/language/translate/v2

以下のような結果が返ってきたら成功です。

{
  "data": {
    "translations": [
      {
        "translatedText": "Product name you want to translate"
      }
    ]
  }
}

あとはアプリケーション側にリフレッシュトークンからアクセストークンを取得する処理と、アクセストークンを使って翻訳を実行する処理を組み込むだけです。