claude-skills/

Anthropic公式スキル・プラグインの日本語ディレクトリ

last sync 22h ago
スキルOfficialsecurity

🔐express-oauth2-jwt-bearer

プラグイン
auth0
ライセンス
Apache-2.0

説明

次のような場合に使用: Express または Node.js の API エンドポイントを、JWT Bearer トークンの検証・スコープベースのアクセス制御・DPoP バインディングで保護する場合。 `express-oauth2-jwt-bearer` と統合されており、ユーザーが「Express API でトークンを検証したい」や「Node.js の API エンドポイントを保護したい」と言った場合にも使用すること。

原文を表示

Use when protecting Express or Node.js API endpoints with JWT Bearer token validation, scope-based access control, or DPoP binding. Integrates express-oauth2-jwt-bearer — use even if the user says "validate tokens in my Express API" or "protect my Node.js API endpoints".

ユースケース

  • Express APIのエンドポイントを保護するとき
  • JWTトークンの検証が必要なとき
  • スコープベースのアクセス制御を実装するとき
  • DoPバインディングで保護したいとき

本文(日本語訳)

Node OAuth2 JWT Bearer インテグレーション

express-oauth2-jwt-bearer パッケージは、Auth0 JWT Bearer アクセストークンを検証するための Express ミドルウェアを提供します。 トークンの抽出、署名の検証、audience および issuer の検証、RFC 6750 に準拠した有効期限チェックを処理するため、JWT のパース処理ではなくビジネスロジックに集中できます。

Agent への指示: SDK のセットアップ手順を提示する前に、以下を実行して最新リリースバージョンを取得してください:

gh api repos/auth0/node-oauth2-jwt-bearer/releases/latest --jq '.tag_name'

取得したバージョンを、以下のハードコードされたバージョンの代わりに、すべての package.json の依存関係行で使用してください。

前提条件

  • Node.js 18 以上(20 以上を推奨。ブートストラップスクリプトの自動化に必要)
  • Express 4.x または 5.x
  • npm または yarn
  • API(Resource Server)が設定済みの Auth0 アカウント
  • Auth0 CLI(自動セットアップ用): npm install -g @auth0/auth0-cli

使用しない場合

ユースケース 推奨 Skill
ログイン UI を持つサーバーサイド Web アプリ(Express セッション)の構築 auth0-express
サーバーサイド認証を持つ Next.js アプリの構築 auth0-nextjs
React / Angular / Vue SPA の構築 auth0-reactauth0-angularauth0-vue
React Native またはモバイルアプリの構築 auth0-react-nativeauth0-androidauth0-swift
ASP.NET Core Web API auth0-aspnetcore-api
JWT ミドルウェアを使用した Go API go-jwt-middleware
Python API(Flask / FastAPI) auth0-api-python
旧来の express-jwt パッケージを使用した Node.js API express-jwt

クイックスタート手順

Agent への指示: 以下の手順に従って、ユーザーの Node.js API プロジェクトに express-oauth2-jwt-bearer を統合してください。

  1. 最新バージョンを取得(上記の指示を参照)。

  2. SDK をインストール:

    npm install express-oauth2-jwt-bearer
    
  3. Auth0 を設定references/setup.md に従ってください。ユーザーがプロンプトで Auth0 Domain と API Audience をすでに提供している場合は、それらを .env ファイルに ISSUER_BASE_URLhttps:// を含む完全な issuer URL)と AUDIENCE として書き込んでください。SDK はこれらを自動的に読み込みます。ブートストラップスクリプトはスキップし、AskUserQuestion を呼び出して再確認しないでください。server.js / app.js 内でドメインや audience をリテラル文字列(または || によるフォールバックデフォルト)としてハードコードしないでください — これらは .env にのみ記述します。そうでない場合は、ブートストラップスクリプトによる自動セットアップか手動セットアップを提示してください。

  4. ミドルウェアをセットアップ — まず Auth0 の値を含む .env ファイルを作成し、それを読み込んでミドルウェアを追加します。express-oauth2-jwt-bearer は環境変数から ISSUER_BASE_URLAUDIENCE を自動的に読み込むため、auth() に引数は不要です:

    # .env
    ISSUER_BASE_URL=https://your-tenant.us.auth0.com
    AUDIENCE=https://your-api-identifier
    
    import 'dotenv/config'; // SDK が process.env を読み込む前に .env を読み込む
    import { auth } from 'express-oauth2-jwt-bearer';
    
    // 環境変数から ISSUER_BASE_URL と AUDIENCE を読み込む — 設定不要
    const checkJwt = auth();
    
    app.use(checkJwt); // グローバルに適用、またはルートごとに適用
    

    issuer と audience は .env に記述してください — リテラル値をインラインで記述したり、ここで引数として渡したりしないでください。

  5. エンドポイントを保護 — ミドルウェアをグローバルまたは特定のルートに適用します:

    // グローバル保護
    app.use(checkJwt);
    
    // またはルートごと
    app.get('/api/private', checkJwt, (req, res) => {
      res.json({ sub: req.auth.payload.sub });
    });
    
  6. RBAC を追加(任意) — requiredScopes() または claimIncludes() を使用して、権限ベースのアクセス制御を実装します:

    import { auth, requiredScopes, claimIncludes } from 'express-oauth2-jwt-bearer';
    
    app.get('/api/messages', checkJwt, requiredScopes('read:messages'), (req, res) => {
      res.json({ messages: [] });
    });
    

    重要: requiredScopes が受け付ける引数は1つだけです — スペース区切りの文字列または配列です。複数の文字列引数を渡さないでください: requiredScopes('read:msg', 'write:msg') は最初の引数以降をサイレントに無視します。代わりに requiredScopes('read:msg write:msg') または requiredScopes(['read:msg', 'write:msg']) を使用してください。

  7. 統合を確認 — ビルドしてテストします:

    node server.js
    curl http://localhost:3000/api/private         # 401 が返るはず
    curl -H "Authorization: Bearer <token>" http://localhost:3000/api/private  # 200 が返るはず
    
  8. 失敗チェック: サーバーの起動に失敗した場合やトークンが予期せず拒否された場合は、references/api.md で一般的な問題を確認してください。5〜6 回の試行が失敗した場合は、AskUserQuestion を使用してユーザーの環境に関する詳細情報を確認してください。

詳細ドキュメント

  • セットアップガイド — Auth0 API の登録、.env の設定、自動セットアップ用ブートストラップスクリプト、シークレット管理
  • インテグレーションパターン — 保護されたエンドポイント、スコープとクレームによる RBAC、DPoP、CORS 設定、エラーハンドリング、curl によるテスト
  • API リファレンスとテスト — 全設定オプション、クレームリファレンス、完全なコード例、テストチェックリスト、一般的な問題

よくある間違い

間違い 症状 修正方法
Auth0 ダッシュボードで API ではなく Application を作成した トークン検証の失敗、間違った audience Auth0 ダッシュボード → APIs で新しい API(Resource Server)を作成する
Audience が API identifier と完全に一致していない 401 Unauthorized — "Audience mismatch" Auth0 ダッシュボード → APIs から API Identifier 文字列をそのままコピーする
ISSUER_BASE_URLhttps:// スキームがない 起動時に Error: Invalid URL ISSUER_BASE_URL は完全な issuer URL でなければなりません: https://your-tenant.us.auth0.com
RBAC に permissions クレームではなく scope クレームを確認している 常に 403 が返るか、権限が無視される スコープベースの RBAC には requiredScopes() を使用し、Auth0 RBAC のパーミッションクレームには claimIncludes('permissions', 'read:data') を使用する
auth ミドルウェアより前に CORS が設定されていない プリフライトの OPTIONS リクエストが 401 を返す ミドルウェアチェーンで auth() より前に cors() ミドルウェアを追加する
.env ファイルが読み込まれていない domain / audience が undefined エントリファイルの先頭に import 'dotenv/config' を追加する
ソース内でドメイン / audience をハードコードしている(process.env.X || 'literal' によるフォールバックを含む) シークレットがソースにコミットされ、セキュリティレビューに失敗する 値を .envISSUER_BASE_URL / AUDIENCE)に記述し、auth() が自動的に読み込むようにする — リテラルのフォールバックは使用しない
req.auth が undefined TypeError: Cannot read properties of undefined ハンドラの前に checkJwt ミドルウェアが実行されていることを確認する

関連 Skill

クイックリファレンス

コアミドルウェア

関数 説明 戻り値
auth(options?) JWT Bearer 検証ミドルウェア Handler — トークンが無効または欠如している場合 401
requiredScopes(scopes) トークンが必要なスコープをすべて持っているか検証 Handler — スコープが不足している場合 403
scopeIncludesAny(scopes) トークンが少なくとも1つのスコープを持っているか検証 Handler — 一致しない場合 403
claimEquals(claim, value) クレームが値と等しいか検証 Handler — 不一致の場合 401
claimIncludes(claim, ...values) クレームがすべての値を含んでいるか検証 Handler — 不完全な場合 401
claimCheck(fn, desc?) カスタムクレーム検証関数 Handler — fn が false を返した場合 401

設定オプション

オプション 説明
issuerBaseURL string https:// を含む完全な issuer URL。省略可能 — デフォルトは ISSUER_BASE_URL 環境変数
audience string Auth0 ダッシュボードの API Identifier。省略可能 — デフォルトは AUDIENCE 環境変数
tokenSigningAlg string 署名アルゴリズム(デフォルト: RS256。対称鍵の場合は HS256
authRequired boolean 認証を任意にする場合は false を設定(デフォルト: true
clockTolerance number 時刻のずれの許容秒数(デフォルトなし。設定しない限り undefined)
dpop DPoPOptions DPoP 設定(integration.md を参照)

環境変数

変数 説明
ISSUER_BASE_URL https:// を含む完全な issuer URL。例: https://your-tenant.us.auth0.com(SDK が自動検出)
AUDIENCE API Identifier。例: https://your-api-identifier(SDK が自動検出)

リクエストオブジェクト

検証成功後、req.auth には以下が含まれます:

req.auth.payload    // デコードされた JWT ペイロード(sub, iss, aud, exp, permissions など)
req.auth.header     // JWT ヘッダー(alg, typ, kid)
req.auth.token      // 生の JWT 文字列

SDK アーキテクチャ

node-oauth2-jwt-bearer モノリポジトリには3つのパッケージが含まれています:

パッケージ 用途
express-oauth2-jwt-bearer メインパッケージ。 JWT Bearer 検証用の Express ミドルウェア。npm に公開済み。
access-token-jwt 低レベ
原文(English)を表示

Node OAuth2 JWT Bearer Integration

The express-oauth2-jwt-bearer package provides Express middleware for validating Auth0 JWT Bearer access tokens. It handles token extraction, signature verification, audience and issuer validation, and expiry checks per RFC 6750 — letting you focus on business logic rather than JWT parsing.

Agent instruction: Before providing SDK setup instructions, fetch the latest release version by running:

gh api repos/auth0/node-oauth2-jwt-bearer/releases/latest --jq '.tag_name'

Use the returned version in all package.json dependency lines instead of any hardcoded version below.

Prerequisites

  • Node.js 18+ (20+ recommended; required for bootstrap script automation)
  • Express 4.x or 5.x
  • npm or yarn
  • An Auth0 account with a configured API (Resource Server)
  • Auth0 CLI (for automatic setup): npm install -g @auth0/auth0-cli

When NOT to Use

Use Case Recommended Skill
Building a server-side web app with login UI (Express sessions) auth0-express
Building a Next.js app with server-side auth auth0-nextjs
Building a React/Angular/Vue SPA auth0-react, auth0-angular, auth0-vue
Building a React Native or mobile app auth0-react-native, auth0-android, auth0-swift
ASP.NET Core Web API auth0-aspnetcore-api
Go API with JWT middleware go-jwt-middleware
Python API (Flask/FastAPI) auth0-api-python
Node.js API using the older express-jwt package express-jwt

Quick Start Workflow

Agent instruction: Follow these steps to integrate express-oauth2-jwt-bearer into the user's Node.js API project.

  1. Fetch latest version (see instruction above).

  2. Install the SDK:

    npm install express-oauth2-jwt-bearer
    
  3. Configure Auth0 — follow references/setup.md. If the user already provided their Auth0 Domain and API Audience in the prompt, write them to a .env file as ISSUER_BASE_URL (the full issuer URL, including https://) and AUDIENCE — the SDK reads these automatically. Skip the bootstrap script and do NOT call AskUserQuestion to re-confirm. Never hardcode the domain or audience as literal strings (or || fallback defaults) in server.js / app.js — they belong in .env only. Otherwise, offer automatic setup via bootstrap script or manual setup.

  4. Set up middleware — first create a .env file with the Auth0 values, then load it and add the middleware. express-oauth2-jwt-bearer reads ISSUER_BASE_URL and AUDIENCE from the environment automatically, so auth() needs no arguments:

    # .env
    ISSUER_BASE_URL=https://your-tenant.us.auth0.com
    AUDIENCE=https://your-api-identifier
    
    import 'dotenv/config'; // load .env before the SDK reads process.env
    import { auth } from 'express-oauth2-jwt-bearer';
    
    // Reads ISSUER_BASE_URL and AUDIENCE from the environment — no config needed
    const checkJwt = auth();
    
    app.use(checkJwt); // apply globally, or per-route
    

    Keep the issuer and audience in .env — do not inline literal values or pass them as arguments here.

  5. Protect endpoints — apply middleware globally or to specific routes:

    // Global protection
    app.use(checkJwt);
    
    // Or per-route
    app.get('/api/private', checkJwt, (req, res) => {
      res.json({ sub: req.auth.payload.sub });
    });
    
  6. Add RBAC (optional) — use requiredScopes() or claimIncludes() for permission-based access:

    import { auth, requiredScopes, claimIncludes } from 'express-oauth2-jwt-bearer';
    
    app.get('/api/messages', checkJwt, requiredScopes('read:messages'), (req, res) => {
      res.json({ messages: [] });
    });
    

    Important: requiredScopes accepts a single argument — a space-separated string or an array. Do NOT pass multiple string arguments: requiredScopes('read:msg', 'write:msg') silently ignores everything after the first. Use requiredScopes('read:msg write:msg') or requiredScopes(['read:msg', 'write:msg']) instead.

  7. Verify the integration — build and test:

    node server.js
    curl http://localhost:3000/api/private         # should return 401
    curl -H "Authorization: Bearer <token>" http://localhost:3000/api/private  # should return 200
    
  8. Failcheck: If the server fails to start or tokens are rejected unexpectedly, check references/api.md for common issues. After 5-6 failed iterations, use AskUserQuestion to ask the user for more details about their environment.

Detailed Documentation

  • Setup Guide — Auth0 API registration, .env configuration, bootstrap script for automated setup, and secret management
  • Integration Patterns — Protected endpoints, RBAC with scopes and claims, DPoP, CORS setup, error handling, and testing with curl
  • API Reference & Testing — Full configuration options, claims reference, complete code example, testing checklist, and common issues

Common Mistakes

Mistake Symptom Fix
Created an Application instead of an API in Auth0 Dashboard Token validation fails; wrong audience Create a new API (Resource Server) in Auth0 Dashboard → APIs
Audience doesn't match API identifier exactly 401 Unauthorized — "Audience mismatch" Copy the exact API Identifier string from Auth0 Dashboard → APIs
ISSUER_BASE_URL missing the https:// scheme Error: Invalid URL at startup ISSUER_BASE_URL must be the full issuer URL: https://your-tenant.us.auth0.com
Checking scope claim instead of permissions for RBAC 403 always returned or permissions ignored Use requiredScopes() for scope-based RBAC; use claimIncludes('permissions', 'read:data') for Auth0 RBAC permission claims
CORS not configured before auth middleware Preflight OPTIONS requests return 401 Add cors() middleware before auth() in the middleware chain
.env file not loaded undefined for domain/audience Add import 'dotenv/config' at the top of the entry file
Hardcoded domain/audience in source (incl. process.env.X || 'literal' fallbacks) Secrets committed to source; fails security review Put values in .env (ISSUER_BASE_URL / AUDIENCE) and let auth() read them automatically — no literal fallbacks
req.auth is undefined TypeError: Cannot read properties of undefined Verify checkJwt middleware runs before the handler

Related Skills

Quick Reference

Core Middleware

Function Description Returns
auth(options?) JWT Bearer validation middleware Handler — 401 if token invalid/missing
requiredScopes(scopes) Validates token has all required scopes Handler — 403 if scopes missing
scopeIncludesAny(scopes) Validates token has at least one scope Handler — 403 if no match
claimEquals(claim, value) Validates a claim equals a value Handler — 401 if mismatch
claimIncludes(claim, ...values) Validates claim includes all values Handler — 401 if incomplete
claimCheck(fn, desc?) Custom claim validation function Handler — 401 if fn returns false

Configuration Options

Option Type Description
issuerBaseURL string Full issuer URL with https://. Optional — defaults to the ISSUER_BASE_URL env var
audience string API Identifier from Auth0 Dashboard. Optional — defaults to the AUDIENCE env var
tokenSigningAlg string Signing algorithm (default: RS256; use HS256 for symmetric)
authRequired boolean Set false to make authentication optional (default: true)
clockTolerance number Clock skew tolerance in seconds (no default; undefined unless set)
dpop DPoPOptions DPoP configuration (see integration.md)

Environment Variables

Variable Description
ISSUER_BASE_URL Full issuer URL with https://, e.g. https://your-tenant.us.auth0.com (auto-detected by SDK)
AUDIENCE API Identifier, e.g. https://your-api-identifier (auto-detected by SDK)

Request Object

After successful validation, req.auth contains:

req.auth.payload    // Decoded JWT payload (sub, iss, aud, exp, permissions, etc.)
req.auth.header     // JWT header (alg, typ, kid)
req.auth.token      // Raw JWT string

SDK Architecture

The node-oauth2-jwt-bearer monorepo contains three packages:

Package Purpose
express-oauth2-jwt-bearer Main package. Express middleware for JWT Bearer validation. Published to npm.
access-token-jwt Low-level JWT verification utilities (used internally).
oauth2-bearer RFC 6750 Bearer token extraction (used internally).

In practice, you only install and import express-oauth2-jwt-bearer.

Auth Flow Comparison

Auth Pattern SDK When to Use
JWT Bearer (stateless) express-oauth2-jwt-bearer APIs called by SPAs, mobile apps, M2M clients
Session-based (stateful) @auth0/express-openid-connect Web apps with login UI and server-side sessions

Testing Quick Reference

# Get test token from Auth0 Dashboard → APIs → your API → Test tab
# Copy the token, then:

# 1. Verify 401 on protected route (no token)
curl -v http://localhost:3000/api/private

# 2. Verify 200 with valid token
curl -H "Authorization: Bearer <paste-token-here>" http://localhost:3000/api/private

# 3. Verify 403 with valid token but missing scope
curl -H "Authorization: Bearer <paste-token-here>" http://localhost:3000/api/admin

# 4. Verify CORS preflight
curl -v -X OPTIONS http://localhost:3000/api/private \
  -H "Origin: http://localhost:5173" \
  -H "Access-Control-Request-Method: GET" \
  -H "Access-Control-Request-Headers: Authorization"

References

原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。