GCPのOAuthで苦戦した話。redirect_uri ってなんぞや

GoogleのOAuthの認証。

とにかく無駄な時間を過ごしてしまった……

検索したらどのページでもさらっと紹介しているのですが、なぜかうまくいかない。

とりわけしんどかったのが、redirect_uri周りのところ。

簡単そうな箇所でひっかかって無駄な工数を消費する罪悪感は言葉にできないものがありますよね。。

ということで、同じ悩みを持つ人がもしいたらお役に立てられるよう、今回はredirect_uriを設定して認証を通すまでの手順を紹介します。

(OAuthの仕組み等の知識に関しては割愛します)

目次

なぜOAuthが必要だったか

今回はDirectory APIを外部から叩きたかったのですが、その際に使用するトークンを取得するために認証を通す必要がありました。

なお、ここで使用するコードはGo言語で記述していますが、公式リファレンスに記載してあるコードをそのまま使うため、別言語でも動揺に公式リファレンスに記載のものを使用すれば上手くいくものと思われます。

認証を通すまでの手順

まずOAuthの認証を通すさっくりした手順ですが、

  1. GCPの設定をする
    1. ライブラリで使用したいものを有効にする
    2. OAuth同意画面の設定
    3. 認証情報の設定
    4. ClientID、Secret等が記載されたJSONファイルを取得
  2. OAuth認証を通す
    1. サンプルコードを実行
    2. 認証を通してtoken.jsonを取得

以上になります。

最後に取得したtoken.jsonを使ってAPIが叩けるようになる仕組みです。

迷いなくできれば10分程度で終わる作業になります。

今回ひとつひとつは紹介せず、redirect_uriのところだけちゃんと解説します。

GCPの設定をする

まずはGCPでの設定です。

  • ライブラリで使用したいものを有効にする
  • OAuth同意画面の設定

ここについては様々な記事で紹介されているので、それを参考に設定してください。

redirect_uriが関係するのは、認証情報の設定についての部分です。

認証情報の設定とJSONファイルの取得

認証情報の設定についてですが、基本的には案内に沿って必要情報を入力するだけです。

  1. 認証情報画面で「+認証情報を作成」を選択
  2. 「OAuthクライアントID」を選択
  3. 案内に沿って必要情報を入力(今回は参考までに私が入力したものを記載します)
    1. アプリケーションの種類: ウェブ アプリケーション
    2. 名前: OAuth test
    3. 承認済みのJavaScript生成元: Blank
    4. 承認済みのリダイレクトURI: http://localhost:8080
  4. OAuthクライアントを作成しましたダイアログの左下にある「JSONをダウンロード」をクリックしてclient_secret_XXX.jsonをダウンロード

これで取得したファイルをcredentials.jsonという名前に変更し、この後に登場するサンプルコードと同じディレクトリに保存します。

OAuth認証を通す

サンプルコードですが、今回はGo言語で実施ということでこちらの公式リファレンスを参考に取得しました。

[blogcard url=”https://developers.google.com/admin-sdk/directory/v1/quickstart/go”]

こちらに記載のquickstart.goをコピペして、コンソール上で実行します。

$go run quickstart.go

するとコンソールに以下のメッセージが表示されます。

“Go to the following link in your browser then type the authorization code: https://accounts.google.com…”

このメッセージのURLをコピーして、 Chrome(ブラウザ)を開いてアクセスします。

そうするとGoogleのアカウント認証になるので、ログインおよびアクセス許可をします。

ここからがポイントです。

認証が完了すると、リダイレクトURIで指定した箇所にリダイレクト(ブラウザのページを移動)させようとします。今回はhttp://localhost:8080です。

このとき、PCでサービスを起動していなければlocalhostのページは開かれませんよね。
つまり、404エラーが出るはずです。

不安になるかと思いますが、それでも大丈夫です

リダイレクトされた際のURLが必要なものなので、ページが表示される必要はありません。

そのURLを見ると、以下のようになっています。

“http://localhost:8080/?state=state-token&code=…&scope=https://www.googleapis.com/…”

このURLのうち、&codeに記載されているパラメータをコピーして、Goを実行しているターミナルに入力します。

すると処理が完了して、Goを実行したディレクトリにtoken.jsonが作成されているため、これを使用してAPIを実行しましょう。

その他見かけるエラー

今回の対応に関連して私が見かけた範囲でのエラーを記載しておきます。

ファイアウォールによる拒否

404にならずとも、ファイアウォールによるリダイレクト拒否もありえます。

前述のとおりリダイレクトした際のCodeさえあれば問題ないですが、事情によってはホワイトリストに追加する等、セキュリティについても考える必要があります。

invalid_grant

こちらも結構重要なエラーと思われます。

Response: {
"error": "invalid_grant",
"error_description": "Malformed auth code."
}

上記のようなエラーが出た際は、認証情報の期限切れが疑われます。

  • Codeを取得してからトークンを取得せず一定時間以上経った
  • 最後にトークンを取得してから半年以上リフレッシュしないままでいた

などをしていた際、このエラーが起きるようです。

新規で認証情報を作り直し、再度トークンを生成すれば使えるようになります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

都内Edtech企業のコーポレートエンジニア。
業務改善・自動化についての開発をしています。
エンジニア歴9年、コーポレートエンジニア歴4年。

目次