Auth0のAPIの使い方

https://www.youtube.com/watch?v=Tlk2pT-RKxM

https://developer.okta.com/

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” }
  • 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;
      }
      
  • 認証(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)を使って検証する

トラブルシューティングの手順(短く)

  1. まず /oauth/token を正しいパラメータで呼んでアクセストークンを取得できるか確認
  2. Management API を curl で Authorization ヘッダ付きで呼んでみる
  3. エラーが返る場合はレスポンスの error / error_description を確認
  4. 発行されたトークンが 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 ダッシュボードでの具体的な設定手順(スクリーンショット付きの手順が欲しい場合は依頼)
    • セキュリティチェックリストや最小限のスコープテンプレート