この記事ではサルでも分かるように解説します
GASで作成したWebアプリを使用するためにトークンを取得する場合は、以下の記事の方が手順が少なくて楽です。

GAS以外のアプリでGoogleAPIを叩きたい場合は、この記事を読んでください!
リフレッシュトークン/アクセストークンって何?

アクセス?リフレッシュ?違いがよく分からないな



そんなアナタに前提知識を超簡単に解説します
アクセストークンは、Webサービスにアクセスするための鍵のことです。
リフレッシュトークンは、アクセストークンを取得するための鍵のことです。
アクセストークンは取得しても短時間で期限切れになるので、リフレッシュトークンで再発行してあげる必要があるんですね。



リフレッシュトークンでアクセストークンを取得するのか



そうです。そしてアクセストークンでサービスにアクセスします
公式ドキュメント
この記事では以下の3ステップで、アクセストークン/リフレッシュトークンを取得する方法について、サルでも分かるように丁寧に解説します!
STEP①:GoogleCloudConsoleでOAuth 2.0認証情報を取得する



ちょっと言ってる意味が分かりません



サルでも分かるように手順を解説します!
この章のゴールは
- GoogleCloudConsoleでOAuthクライアントID、クライアントシークレットが取得できること
- 使用したいAPIを有効化できること
よってこの2点が完了済みの方は、STEP②認可コード取得へ進んでください。
1-1 GoogleCloudConsoleでプロジェクトの作成/選択



すでにGoogleCloudConsoleでプロジェクトを作成済みの方は、飛ばしてOKです。
GoogleCloudConsoleにアクセスしましょう。
以下の画像のように新しいプロジェクトを作成します。
※「GeminiAPI」という文字は私のプロジェクト名なので、ここは違う文字になっているはずです。


適当なプロジェクト名を付けて作成をクリックします。


画面上部のプロジェクト名を確認し、先ほど作成したプロジェクトになっていることを確認しましょう。
もし違う名前なら、プロジェクト名をクリックして切り替えます。


1-2 APIの有効化
「APIとサービス」をクリックします。


「ライブラリ」をクリックします。
自分が使用したいAPIを検索して有効化してください。


私は生成AI「Gemini」のAPIを使いたいので、Geminiと検索しました。
以下のように対象APIを「有効化」します。


1-3 OAuth2.0で同意画面を構成
「認証情報」→「認証情報を作成」→「OAuthクライアントID」の順にクリックします。


「同意画面を構成」をクリックします。


「開始」をクリックします。


以下の項目を入力し、次へボタンをクリックします。
- アプリ名:適当にアプリ名を付けておきましょう
- ユーザーサポートメール:アプリの問い合わせ先になるメールアドレスです。適当な自分のメアドでOKです。


このアプリを誰に公開するか選択します。
内部・外部の違いは以下の通りです。
- 内部
-
自社や団体など特定の組織内のユーザーだけが利用するアプリ向けです。
- 利用できる人: 組織に所属するメンバーのみ
- 審査: アプリの公開前に改めて「確認依頼」を出す必要はありません
- 外部
-
外部のユーザー(Googleアカウントを持っている一般の方)でも利用できるアプリ向けです。
- 利用できる人: テストユーザーとしてリストに加えたGoogleアカウントを持つ方
- 審査: 本格的に公開する際、Googleからの確認(審査)が必要になる場合があります
私の個人アカウントは組織に所属していないので「外部」にします。



外部にすると誰でもアクセスできるの?



テストユーザーに登録した人に限定できます(手順は後述)


連絡先は適当に自分のメールアドレスを登録ください。
最後にポリシーに同意して、作成をクリックします。


1-4 OAuth2.0でクライアントIDを作成
「OAuthクライアントを作成」をクリックします。


以下の手順で、OAuthクライアントIDを作成してください。
- アプリケーションの種類を「ウェブアプリケーション」に設定します。
※モバイルアプリなどの場合は、適切なアプリケーションタイプを選択してください - 名前は任意で入力します。
- 承認済みのリダイレクトURIに、認可後にユーザーが戻るURLを入力します。
(例:http://localhostや実際に構築するコールバックURI) - 「作成」をクリック



承認済みのリダイレクトURIって何を設定すればいいの?



特に指定したいURLがない場合は「http://localhost」でOKです!


作成をクリックすると、「クライアントID」と「クライアントシークレット」が取得できます。
後続処理で使うので、メモしておきましょう。


1-5 テストユーザーの追加
このアプリにアクセスできるユーザーを指定しましょう。
「対象」メニューを開いて、テストユーザー欄の「+AddUsers」をクリックします。


ユーザー追加画面が表示されたら、自分が使用するGoogleメールアドレス記載して保存しましょう。





これでSTEP①は完了です!
STEP②:認可コードの取得
アクセス/リフレッシュトークンを取得するためには、一時的な認可コードを得る必要があります。
この認可コード取得の際に、先ほど構成したOAuth同意画面を使用します!
この章のゴールは
- 認可コードを取得すること
よって認可コードを既に取得済みの方は、STEP③アクセストークンを取得するへ進んでください。
2-1 認可リクエストURLの作成
認可コードを取得するためのURLを作成しましょう。
URLのテンプレートがこちらです。(このままでは使えません)
https://accounts.google.com/o/oauth2/v2/auth?
client_id={あなたのクライアントID}&
redirect_uri={STEP1で設定したリダイレクトURI}&
response_type=code&
scope={使用したいAPIを実行するために必要なスコープ}&
access_type=offline&
prompt=consent
各パラメーターについて解説します。
- 1. EndPoint(必須)
-
Googleの認可リクエストを開始するための基本的なURLです。
https://accounts.google.com/o/oauth2/v2/auth
で固定です。 - 2. client_id(必須)
-
STEP①の1-4で取得したクライアントIDを設定しましょう。
- 3. redirect_uri(必須)
-
STEP①の1-4で指定したリダイレクトURIを設定しましょう。
- 4. response_type(必須)
-
認可コードを取得することを示すパラメーターです。固定でOKです。
- 5. scope(必須)
-
アクセスしたいリソースに対応するスコープを指定します。
複数の場合は%20
で区切ります。例えばユーザーのメールアドレスやプロフィール情報を取得する場合は、「https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/userinfo.profile」を指定します。
- 6. access_type(省略可能:リフレッシュトークンを取得するなら必須)
-
2つのオプションがあります。リフレッシュトークンを取得する場合はテンプレート固定でOKです。
- offline:リフレッシュトークンを取得します
- online:リフレッシュトークンを取得しません(規定値)
- 7. prompt(省略可能)
-
4つのオプションがあります。
- consent:常に同意画面を表示させる
- select_account:ユーザーにアカウント選択をさせる
- none:ユーザーに一切の操作を求めない(未ログイン、権限不足の場合はエラー)
- 省略する:ユーザーの状況に応じた標準的な認証フローが実行される
よく分からない場合は、テンプレートのままでOKです。
- 8. state(省略可能)
-
CSRF攻撃を防ぐためのパラメーターです。CSRF攻撃とは、悪意のある第三者がユーザーになりすまして、意図しない操作をさせる攻撃です。
ややこしいので今回は省略します。



「5. scope」の%20で区切るってどういうこと?



本来はスペースで区切るのですが、URLにスペースを入れるとエラーになります。なのでスペースをエンコードして「%20」にしています。
スコープについては死ぬほど種類があるので、公式ドキュメントを見るか、必要なスコープをググってください。
https://developers.google.com/identity/protocols/oauth2/scopes?hl=ja
私はGeminiAPIを使うので、以下のようなリクエストURLを作成しました。
https://accounts.google.com/o/oauth2/v2/auth?
client_id={シークレットIDは非公開}.apps.googleusercontent.com&
redirect_uri=http://localhost&
response_type=code&
scope=https://www.googleapis.com/auth/generative-language.tuning&
access_type=offline&
prompt=consent
2-2 リクエストURLから認可コードを取得する
ブラウザのタブを開き、先ほど作成したURLにアクセスします。


自身のGoogleアカウントを選択・ログインしてください。
以下の画面が表示されたら「続行」→「続行」と進みます。
2つ目の画面で「〇〇を許可する」みたいなチェックボックスがあれば、チェックをいれましょう。


上記画面が表示されずエラーになる場合、ここまでの設定に不備があります。
よくあるエラーも参考にしてください。
続行すると以下の画面が表示されるので、URLをコピーしてください。
このURLに認可コードが含まれています!


取得できるURLの構成です。認可コードの部分を保存しておきましょう。
http://localhost/?code={認可コード}&scope=https://www.googleapis.com/auth/generative-language.tuning



これでSTEP②認可コードの取得は完了です!



次が最後です。トークンを取得しましょう!
STEP③:アクセストークン/リフレッシュトークンを取得する
取得した認可コードを使って、Googleのエンドポイントにリクエストを送り、アクセストークンとリフレッシュトークンを受け取ります。



エンドポイントって何?



あるサービスや機能を利用したいときに、どこにアクセスすれば良いのかを示す「住所」のようなものです。
エンドポイントに対してリクエストを送信することで、サーバー側の機能を利用したり、データを取得したりすることができます。今回はGoogleのOAuth2.0認証を開始するためのエンドポイントを使用して、OAuth認証を通します。
ちなみにGoogleのTokenエンドポイントは以下のURLです。
https://www.googleapis.com/oauth2/v4/token
3-1 コマンドプロンプト(ターミナル)を開く
これからcURLという機能を使って、GoogleのエンドポイントにHTTPリクエストを送信します。
そうするとリフレッシュ/アクセストークンを取得できます。



cURL?どうやって使うのかさっぱり分かりません



cURLはネット上の情報を取得できるツールと思ってください



コマンドプロンプト(Macならターミナル)で実行できます
cURLはコマンドラインから手軽にウェブや、その他のネット上のリソースとやり取りするための便利なツールです。特に開発者やシステム管理者にとって、APIのテストやスクリプトによる自動化などで広く利用されています。
ということで、コマンドプロンプトを起動しましょう。
Windowsの検索バーに「コマンドプロンプト」と入力し、表示された結果をクリックします。


3-2 コマンドを実行してアクセス/リフレッシュトークンを取得
GoogleのTokenエンドポイントに、POSTリクエストを送信します。コマンドのテンプレートは以下の通りです。
curl -X POST "https://www.googleapis.com/oauth2/v4/token" --header "Content-Type: application/x-www-form-urlencoded" --data "code={認可コード}&redirect_uri={リダイレクトURI}&client_id={クライアントID}&client_secret={クライアントシークレット}&grant_type=authorization_code"



{変数名}の部分にそれぞれ値を入れていきましょう
テンプレートコードは改行しないでください。エラーの原因になります。
各パラメーターについて解説します。
- 1. トークンエンドポイント
-
GoogleのTokenエンドポイントを設定します。テンプレートに以下のURLを挿入済みです。
https://www.googleapis.com/oauth2/v4/token - 2. 認可コード
-
STEP②で取得した「認可コード」を設定します。
- 3. リダイレクトURI
-
STEP①で指定したリダイレクトURIを設定します。
- 4. クライアントID
-
STEP①で指定したクライアントIDを設定します。
- 5. クライアントシークレット
-
STEP①で指定したクライアントシークレットを設定します。
- 6. グラントタイプ
-
OAuth 2.0のエンドポイントに送信するリクエストにて、どの方法でアクセストークンを取得するのかを指定するものです。複数のオプションがあります。
- authorization_code:認可コードとクライアントIDなどを利用して、アクセストークンを取得します。
- refresh_token:リフレッシュトークンを使用して新しいアクセストークンを取得する際に使用します。
- password:ユーザー名とパスワードをトークンエンドポイントに送信して、アクセストークンを取得します。
- client_credentials:クライアントIDなどを利用してアクセストークンを取得します。
今回は「authorization_code」を使用しますので、テンプレートにも設定済みです。
実際に出来上がったコマンドはこちらです。
curl -X POST "https://www.googleapis.com/oauth2/v4/token" --header "Content-Type: application/x-www-form-urlencoded" --data "code=4/0Ab_5qlk6ImuoK-ebX_Jt5Hv1rd9J7WgsLwInfhcgMU3jf3TPazo6AO-_3xiIlts-2wHEYw&redirect_uri=http://localhost&client_id=195746033599-o0tdp2o253kh100pbs31r212i41f39ci.apps.googleusercontent.com&client_secret=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&grant_type=authorization_code"
これをコマンドプロンプトに貼りつけてEnterキーで送信します。
赤枠が貼りつけたコマンドで、その下がエンドポイントからの応答となります。


ちゃんと「access_token」や「refresh_token」が取得できていますね!
上記画面が表示されずエラーになる場合、ここまでの設定に不備があります。
よくあるエラーも参考にしてください。
戻り値についても簡単に解説します。
- access_token:アクセストークンは、GoogleCloudにアクセスする一時的な鍵です。
- expires_in:アクセストークンの有効期限(秒)です。
- refresh_token:リフレッシュトークンは、新しいアクセストークンを取得するための鍵です。
- scope:トークンに付与された権限の範囲です。
- token_type:トークンの種類です。
- refresh_token_expires_in:リフレッシュトークンの有効期限(秒)です。



アクセストークンとリフレッシュトークンを取得できました!



お疲れさまでした!
よくあるエラーと解決方法



最後によくあるエラーについて解説します
- ①認可コード取得時のエラー
アクセスをブロック: Gemini は Google の審査プロセスを完了していません
Gemini は Google の審査プロセスを完了していません。このアプリは現在テスト中で、デベロッパーに承認されたテスターのみがアクセスできます。アクセス権があると思われる場合は、デベロッパーにお問い合わせください。
Gemini のデベロッパーの場合は、エラーの詳細をご確認ください。
エラー 403: access_denied -
GoogleCloudConsoleであなたのGoogleアカウントがテストユーザーに追加されていないのが原因です。
Step①の「テストユーザーを追加」の手順を実施ください。 - ②コマンドプロンプト送信時に発生するエラー
411.That’s an error.POST requests require a Content-length header. That’s all we know.
curl: (3) URL rejected: Bad hostname -
コマンドプロンプトに改行が入ってたりして、コマンドが正しく送信できていません。
Step③の「コマンドを実行してアクセス/リフレッシュトークンを取得」のコマンドテンプレートを正しく利用ください。 - ③コマンドプロンプト送信時に発生するエラー2
{“error”: “invalid_grant”,
“error_description”: “Bad Request”} -
複数の原因が考えられます。
- 認可コードの使いまわし:認可コードは1回しか利用できません。認可コードを再取得してください。
- 認可コードの有効期限切れ:認可コードは短時間で有効期限が切れます。認可コードを再取得してください。
- リダイレクトURIの不一致:リダイレクトURIは認可コード取得時と同じである必要があります。リダイレクトURIが正しいか確認してください。
コメント