Skip to main content

AI を使って Auth0 を統合する

Claude Code、Cursor、GitHub Copilot などの AI コーディングアシスタントを使っている場合は、Agent Skills を使うことで、数分で Auth0 API 認証を自動的に追加できます。インストール:
次に、AI アシスタントに以下のように依頼します。
AI アシスタントが、Auth0 API の作成、資格情報の取得、go-jwt-middleware のインストール、バリデーター の設定、JWT バリデーションによる API エンドポイントの保護を自動的に行います。Agent Skills の完全なドキュメント →
前提条件: 始める前に、以下がインストールされていることを確認してください。
  • Go 1.24 以降 (go-jwt-middleware v3 で ジェネリクス をサポートするために必要)
  • Git (バージョン管理用)
インストールを確認するには、go version を実行します。

はじめに

パブリックアクセス、JWT 認証、権限ごとにスコープが設定されたアクセスという、保護レベルの異なる 3 つのエンドポイントを備えた Go API を構築します。完全な実装では、Go 標準の net/http ライブラリと go-jwt-middleware v3 を使用します。

GitHubでサンプルを見る

テストを含む完全な動作例
1

新しいプロジェクトを作成

Go API用の新しいディレクトリを作成し、モジュールを初期化します。
必要な依存関係をインストールしてください:
プロジェクトの構成を作成します:
go.mod
2

Auth0 API の設定

次に、Auth0 テナントに新しい API を作成し、環境変数をプロジェクトに追加する必要があります。Auth0 API を設定する方法は 2 つあります。CLI コマンドを使う方法と、Auth0 Dashboard から手動で設定する方法です。
Auth0 API を作成するには、プロジェクトのルートディレクトリで次のコマンドを実行します。
作成後、IdentifierDomain の値をコピーして、.env ファイルを作成します。
このコマンドでは次の処理が行われます。
  1. 認証済みかどうかを確認します (必要に応じてログインを求められます)
  2. 指定した identifier で Auth0 API を作成します
  3. ドメインと identifier を含む API の詳細を表示します
セキュリティ: .env ファイルは絶対にバージョン管理にコミットしないでください。.gitignore ファイルに .env を追加してください。
3

API の権限を定義する

権限 (スコープ) を使うと、リソースへのアクセス方法を定義できます。たとえば、マネージャーには read アクセスを、管理者には write アクセスを付与できます。
  1. API の設定で、Permissions タブをクリックします
  2. 次の権限を作成します。
このチュートリアルでは、スコープが設定されたエンドポイントを保護するために read:messages スコープを使用します。アプリケーションの要件に応じて、追加の権限を定義できます。
4

設定ローダーを作成

環境変数を読み込んで検証するための設定パッケージを作成します。
internal/config/auth.go
このコードでできること:
  • 環境変数からAuth0のドメインとaudienceを読み込みます
  • 起動時に、必要な設定がそろっていることを検証します
  • アプリケーション全体で使える、型安全な設定用構造体を返します
5

カスタムクレームとJWTバリデーターの作成

カスタムクレームを使用すると、JWT からアプリケーション固有のデータを抽出して検証できます。バリデーターは、Auth0 を基準にトークンを検証する中核コンポーネントです。
internal/auth/claims.go
重要なポイント:
  • Validate メソッドは、JWT の解析後にミドルウェアによって自動的に呼び出されます
  • HasScope は、スペース区切りのスコープを解析し、権限ベースのアクセス制御に使用します
  • バリデーターは JWKS のキャッシュ (TTL は 5 分) を使用し、30 秒のクロックスキューを許容します
  • RS256 アルゴリズムは、algorithm confusion attacks を防ぐために明示的に設定されています
6

HTTPミドルウェアとハンドラーの作成

HTTP リクエストのバリデーターをラップするミドルウェアです。ハンドラーでは、public、private、permission-scoped の 3 つの保護レベルを示しています。
internal/auth/middleware.go
保護レベル:
  • Public (/api/public) — 認証不要
  • Private (/api/private) — 有効な JWT が必要
  • Scoped (/api/private-scoped) — 有効な JWT と read:messages 権限が必要
7

メインサーバーを作成

本番運用向けのタイムアウト設定と適切なシャットダウン処理を備え、メインのエントリポイントですべてを統合します:
cmd/server/main.go
8

APIの実行とテスト

開発サーバーを起動します。
次のように表示されます: Server starting on :8080公開エンドポイント (認証は不要) をテストします:
以下が表示されます:
トークンを使わずにプライベートエンドポイントをテストします (失敗するはずです) :
401 Unauthorized エラーが表示されます:
有効なトークンでテストするには、Auth0 Dashboard で API を開き、Test タブをクリックしてアクセストークンをコピーします。次に、以下を実行します。
スコープが設定されたエンドポイントをテストします (read:messages 権限が必要です) :
チェックポイントこれで、保護された Go API が用意できたはずです。この API は次のことを行います。
  1. 認証なしでパブリックなエンドポイントへのリクエストを受け付ける
  2. 有効なトークンがない場合、保護されたエンドポイントへのリクエストを拒否する
  3. JWT トークンを Auth0 ドメインと audience に対して検証する
  4. スコープを使用して、権限ベースのアクセス制御を適用する

API の呼び出し

保護された API は、Authorization ヘッダーに Bearer トークンとしてアクセストークンを渡すことで、どのアプリケーションからでも呼び出せます。

クライアントコードの例

シングルページアプリケーションまたはモバイル/ネイティブアプリケーションから API を呼び出す場合は、認可フローが完了するとアクセストークンを取得できます。トークンの取得方法や API の呼び出し方法は、開発しているアプリケーションの種類や使用しているフレームワークによって異なります。

シングルページアプリケーション

React、Vue、Angular の Quickstart とサンプル

モバイル / ネイティブアプリケーション

iOS、Android、React Native の Quickstart

高度な使用方法

RFC 9449 で定義されている DPoP (Demonstrating Proof-of-Possession) は、暗号学的なキー バインディングによってトークンの盗難を防ぎ、セキュリティを強化します。
internal/auth/middleware.go
DPoP モード:
  • DPoPAllowed (default) — Bearer と DPoP の両方のトークンを受け入れる
  • DPoPRequired — DPoP トークンのみを受け入れ、Bearer は拒否する
  • DPoPDisabled — Bearer トークンのみを受け入れ、DPoP は拒否する
DPoP は、金融 API、医療 API、高セキュリティが求められるエンタープライズ アプリケーションに推奨されます。詳しくは DPoP documentation をご覧ください。
Web アプリケーションからのリクエストを許可するには、CORS を有効にします。シンプルなミドルウェア、または rs/cors のようなライブラリを使用できます。
cmd/server/main.go
本番環境では、ワイルドカードではなく正確なオリジンを指定してください。
トークンのバリデーションをデバッグするために、詳細なログを有効にします。
internal/auth/middleware.go
起動時の確認を追加します。
cmd/server/main.go

トラブルシューティング

”Failed to validate JWT” または 401 Unauthorized

問題: API がアクセストークンを見つけられないか、検証できません。解決策:
  1. Authorization ヘッダーが含まれていることを確認してください: Authorization: Bearer YOUR_TOKEN
  2. トークンの前に Bearer が付いていることを確認してください
  3. トークンの有効期限が切れていないことを確認してください
  4. アクセストークンを使用しており、ID トークンではないことを確認してください

”aud claim mismatch”

問題: トークンの audience が API と一致していません。解決策: AUTH0_AUDIENCE が Auth0 Dashboard の API 識別子と完全に一致していることを確認してください。audience の末尾にスラッシュを付けてはいけません。
クライアントアプリケーション側でも、正しい audience パラメーターを指定してトークンをリクエストする必要があります。

“unexpected signing method”

問題: トークンのアルゴリズムがバリデーターの設定と一致していません。解決策:
  1. Auth0 はデフォルトで RS256 (非対称) を使用します
  2. バリデーターで validator.RS256 を指定していることを確認してください
  3. 明示的に設定している場合を除き、Auth0 のトークンに validator.HS256 は使用しないでください

JWKS endpoint に接続できない

問題: JWKS キャッシュプロバイダーが Auth0 の公開鍵エンドポイントに到達できません。解決策:
  1. Auth0 へのネットワーク接続を確認してください (firewall/プロキシ設定)
  2. JWKS endpoint を手動でテストしてください: curl https://YOUR_AUTH0_DOMAIN/.well-known/jwks.json
  3. Auth0 のリージョン (us/eu/au) が正しいことを確認してください

import パスが間違っている

問題: cannot find package "github.com/auth0/go-jwt-middleware/v3/..."解決策: すべての import で /v3 接尾辞を使用していることを確認してください:

クロックスキュー / トークン期限切れエラー

問題: サーバーの時刻がずれているため、有効なトークンが期限切れに見えてしまいます。解決策: バリデーターにはすでに 30 秒のクロックスキュー許容値が含まれています。さらに必要な場合は、次のように調整してください:

クレームの取得に失敗する

問題: ジェネリクス使用時に Failed to retrieve claims が発生します。解決策: 正しい型パラメーターを使用していることを確認してください:

次のステップ

保護されたAPIの準備ができたら、次の項目も確認してみましょう。

リソース