Auth0のAPIの使い方
https://www.youtube.com/watch?v=Tlk2pT-RKxM
https://github.com/JiroYoyogi/auth0-app
Auth0 の API(Authentication API と Management API)の使い方を日本語でわかりやすく整理し、実際のリクエスト例(cURL/Node.js)や設定手順、注意点(セキュリティ・トラブルシューティング)までまとめます。まず概観を示し、そのあと具体例・ベストプラクティスを順に説明します。
概要(何があるか)
- Authentication API(認証フロー用)
- /authorize(ブラウザリダイレクトで認可コード / implicit / PKCE)
- /oauth/token(トークン発行:authorization_code、refresh_token、client_credentials、password など)
- /userinfo(ID トークンやアクセストークンでユーザー情報取得)
- パスワードレスやソーシャルログインもこの辺で扱う
- Management API(ユーザー・接続・クライアント等の管理)
- ベース URL: https://{YOUR_DOMAIN}/api/v2/
- 例: /users, /clients, /connections, /rules など
- アクセスには Machine-to-Machine(M2M)用のアクセストークン(client_credentials)を使う
認証(API を呼ぶためのトークンの取り方)
- Web/API(サーバー間)操作で Management API を叩くときは client_credentials を使う
- トークン取得(例: cURL)
POST https://YOUR_DOMAIN/oauth/token content-type: application/json { "client_id": "YOUR_M2M_CLIENT_ID", "client_secret": "YOUR_M2M_CLIENT_SECRET", "audience": "https://YOUR_DOMAIN/api/v2/", "grant_type": "client_credentials" } - レスポンス例(アクセストークンを Authorization: Bearer として使用) { “access_token”: “eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9…”, “expires_in”: 86400, “token_type”: “Bearer” }
- トークン取得(例: cURL)
- SPA(ブラウザ)やネイティブアプリでは PKCE を使う(client_secret を渡さない)
- 認可コードフロー:
- ユーザーを /authorize へリダイレクト → 承認後 code を受け取り /oauth/token で交換(PKCE を推奨)
- refresh_token は長期ログインに使えるが、SPA では注意(Refresh Token Rotation を検討)
Management API の使い方(例:ユーザー取得・作成)
- ヘッダ
- Authorization: Bearer <M2M_ACCESS_TOKEN>
- Content-Type: application/json
- ユーザー一覧取得(cURL)
GET https://YOUR_DOMAIN/api/v2/users Authorization: Bearer <ACCESS_TOKEN> - ユーザー作成(cURL)
POST https://YOUR_DOMAIN/api/v2/users Authorization: Bearer <ACCESS_TOKEN> Content-Type: application/json { "email": "alice@example.com", "connection": "Username-Password-Authentication", "password": "SecretPassword123!" } - ユーザー更新 /users/{id}、削除 DELETE /users/{id} など
Authentication API(ログイン・トークン取得など)
- 認証コード+PKCE(推奨):
- フロー: /authorize?response_type=code&client_id=…&redirect_uri=…&scope=openid profile email&code_challenge=…&code_challenge_method=S256
- /oauth/token で code を交換(code_verifier を付与)
- Resource Owner Password Grant(ROPG)は推奨されない(可能な限り避ける)
- /oauth/token の一般的な用途:
- grant_type=authorization_code
- grant_type=refresh_token
- grant_type=client_credentials
- grant_type=password(非推奨)
トークン(ID トークン・アクセストークン)の検証
- ID トークン(OpenID Connect)
- 署名アルゴリズムは通常 RS256(公開鍵は /.well-known/jwks.json で取得)
- 検証ポイント:署名、exp(有効期限)、iss(issuer)、aud(client_id)、nonce(使った場合)
- アクセストークンの検証
- API の設計による:Auth0 が発行する Access Token は JWT(aud が API の識別子)であることが多い
- RS256 の場合は JWKS を使って署名検証
- あるいは Auth0 の introspect(必要に応じて)や受信側で JWT 検証ライブラリを使う
Node.js での実例
- 管理用途(client_credentials でトークンを取得し Management API を呼ぶ)
- axios を使った簡単な例:
const axios = require('axios'); async function getManagementToken() { const res = await axios.post('https://YOUR_DOMAIN/oauth/token', { client_id: process.env.AUTH0_M2M_CLIENT_ID, client_secret: process.env.AUTH0_M2M_CLIENT_SECRET, audience: 'https://YOUR_DOMAIN/api/v2/', grant_type: 'client_credentials' }); return res.data.access_token; } async function listUsers() { const token = await getManagementToken(); const res = await axios.get('https://YOUR_DOMAIN/api/v2/users', { headers: { Authorization: `Bearer ${token}` } }); return res.data; }
- axios を使った簡単な例:
- 認証(PKCE)を用いたフローは frontend + backend にまたがるため、Auth0 の SDK(auth0-spa-js など)を使うのが簡単。
Auth0 の公式 SDK
- Server:auth0 (node-auth0) — ManagementClient, AuthenticationClient
- Frontend:@auth0/auth0-spa-js(SPA 用)、@auth0/nextjs-auth0(Next.js)
- 公式 SDK はトークン取得やリフレッシュ、セッション管理を簡単にしてくれるので利用推奨
ダッシュボードでの設定ポイント(重要)
- Application(クライアント)作成:Native / Regular Web App / SPA / M2M App を用途に応じて選ぶ
- Machine-to-Machine Apps:Management API へのアクセスを許可し、必要なスコープを付与(read:users, update:users など)
- Allowed Callback URLs / Logout URLs を正しく設定
- ローテーション:クライアントシークレットはローテートできるので計画的に
- RBAC(ロールベースアクセス制御)やカスタムスコープの利用を検討
セキュリティのベストプラクティス
- SPA では PKCE を必ず使い、client_secret をブラウザに置かない
- サーバー間通信は client_credentials(M2M)を使用し、最小限のスコープを付与する
- シークレットは Vault/Secrets Manager に保管(環境変数ではなく専用ストレージを推奨)
- トークンの検証は必ず行う(署名・iss・aud・exp)
- Refresh Token を扱う際は Rotation と Revoke を検討
- CORS / CSP 設定を確認する
よくあるエラーと対処
- invalid_audience
- /oauth/token の audience が正しいか確認(Management APIなら https://{YOUR_DOMAIN}/api/v2/)
- unauthorized_client
- アプリがその grant_type を許可されているか、Dashboard のクライアント設定を確認
- insufficient_scope
- 発行されたアクセストークンに必要な scope が含まれているか
- invalid_grant
- code の再利用、code_verifier が合っているか、redirect_uri が合っているかなどを確認
- 401(署名検証エラー)
- JWKS で公開鍵を取得し、署名アルゴリズム・キーID(kid)を使って検証する
トラブルシューティングの手順(短く)
- まず /oauth/token を正しいパラメータで呼んでアクセストークンを取得できるか確認
- Management API を curl で Authorization ヘッダ付きで呼んでみる
- エラーが返る場合はレスポンスの error / error_description を確認
- 発行されたトークンが JWT の場合、jwt.io やライブラリでデコードして aud/iss/exp を確認
追加の具体例(cURL)
- Authorization Code(token 交換)の例(サーバー側)
POST https://YOUR_DOMAIN/oauth/token Content-Type: application/x-www-form-urlencoded grant_type=authorization_code& client_id=YOUR_CLIENT_ID& client_secret=YOUR_CLIENT_SECRET& code=AUTH_CODE_FROM_CALLBACK& redirect_uri=https%3A%2F%2Fyourapp.example.com%2Fcallback - Userinfo 取得
GET https://YOUR_DOMAIN/userinfo Authorization: Bearer <ACCESS_TOKEN_FROM_AUTH_FLOW>
監査・ログ・レート制限
- Auth0 Dashboard の Logs でイベントを確認できる
- Rate limit に達すると 429 が返る。高頻度呼び出しはバッチ化やキャッシュで軽減する
参考ライブラリ(トークン検証)
- Node.js:jsonwebtoken + jwks-rsa(jwks をキャッシュして鍵検証)
- 他言語も各種OIDC/JWT ライブラリあり(Go: go-jose / golang-jwt, Python: PyJWT + jwksclient など)
やったこと(この回答で行ったこと)と次にできること
- ここまでで Auth0 の API(Authentication API / Management API)の概観、使い方、リクエスト例、ベストプラクティス、トラブルシューティングをまとめました。
- 次にできること(選べます):
- あなたのユースケースに合わせた具体的な実装サンプル(例:Express + Auth0 でのログイン実装、ユーザー管理バッチ)
- 使っている言語/フレームワーク(例:Ruby on Rails、Next.js、Go)に合わせたコード例
- Auth0 ダッシュボードでの具体的な設定手順(スクリーンショット付きの手順が欲しい場合は依頼)
- セキュリティチェックリストや最小限のスコープテンプレート