🔐express-oauth2-jwt-bearer
- プラグイン
- auth0
- ライセンス
- Apache-2.0
- ソース
- GitHub で見る ↗
説明
次のような場合に使用: 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-react、auth0-angular、auth0-vue |
| React Native またはモバイルアプリの構築 | auth0-react-native、auth0-android、auth0-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を統合してください。
最新バージョンを取得(上記の指示を参照)。
SDK をインストール:
npm install express-oauth2-jwt-bearerAuth0 を設定 —
references/setup.mdに従ってください。ユーザーがプロンプトで Auth0 Domain と API Audience をすでに提供している場合は、それらを.envファイルにISSUER_BASE_URL(https://を含む完全な issuer URL)とAUDIENCEとして書き込んでください。SDK はこれらを自動的に読み込みます。ブートストラップスクリプトはスキップし、AskUserQuestionを呼び出して再確認しないでください。server.js/app.js内でドメインや audience をリテラル文字列(または||によるフォールバックデフォルト)としてハードコードしないでください — これらは.envにのみ記述します。そうでない場合は、ブートストラップスクリプトによる自動セットアップか手動セットアップを提示してください。ミドルウェアをセットアップ — まず Auth0 の値を含む
.envファイルを作成し、それを読み込んでミドルウェアを追加します。express-oauth2-jwt-bearerは環境変数からISSUER_BASE_URLとAUDIENCEを自動的に読み込むため、auth()に引数は不要です:# .env ISSUER_BASE_URL=https://your-tenant.us.auth0.com AUDIENCE=https://your-api-identifierimport '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に記述してください — リテラル値をインラインで記述したり、ここで引数として渡したりしないでください。エンドポイントを保護 — ミドルウェアをグローバルまたは特定のルートに適用します:
// グローバル保護 app.use(checkJwt); // またはルートごと app.get('/api/private', checkJwt, (req, res) => { res.json({ sub: req.auth.payload.sub }); });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'])を使用してください。統合を確認 — ビルドしてテストします:
node server.js curl http://localhost:3000/api/private # 401 が返るはず curl -H "Authorization: Bearer <token>" http://localhost:3000/api/private # 200 が返るはず失敗チェック: サーバーの起動に失敗した場合やトークンが予期せず拒否された場合は、
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_URL に https:// スキームがない |
起動時に 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' によるフォールバックを含む) |
シークレットがソースにコミットされ、セキュリティレビューに失敗する | 値を .env(ISSUER_BASE_URL / AUDIENCE)に記述し、auth() が自動的に読み込むようにする — リテラルのフォールバックは使用しない |
req.auth が undefined |
TypeError: Cannot read properties of undefined |
ハンドラの前に checkJwt ミドルウェアが実行されていることを確認する |
関連 Skill
- auth0-express — ログイン UI を持つ Express Web アプリ(セッション、Cookie)
- auth0-nextjs — Next.js サーバーサイド Web アプリ
- auth0-aspnetcore-api — .NET 向け BACKEND_API リファレンス実装
- go-jwt-middleware — Go API 向け JWT ミドルウェア
- auth0-api-python — Python API(Flask / FastAPI)向け JWT 検証
- auth0-cli — ターミナルから Auth0 リソースを管理
クイックリファレンス
コアミドルウェア
| 関数 | 説明 | 戻り値 |
|---|---|---|
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.jsondependency 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-bearerinto the user's Node.js API project.
Fetch latest version (see instruction above).
Install the SDK:
npm install express-oauth2-jwt-bearerConfigure Auth0 — follow
references/setup.md. If the user already provided their Auth0 Domain and API Audience in the prompt, write them to a.envfile asISSUER_BASE_URL(the full issuer URL, includinghttps://) andAUDIENCE— the SDK reads these automatically. Skip the bootstrap script and do NOT callAskUserQuestionto re-confirm. Never hardcode the domain or audience as literal strings (or||fallback defaults) inserver.js/app.js— they belong in.envonly. Otherwise, offer automatic setup via bootstrap script or manual setup.Set up middleware — first create a
.envfile with the Auth0 values, then load it and add the middleware.express-oauth2-jwt-bearerreadsISSUER_BASE_URLandAUDIENCEfrom the environment automatically, soauth()needs no arguments:# .env ISSUER_BASE_URL=https://your-tenant.us.auth0.com AUDIENCE=https://your-api-identifierimport '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-routeKeep the issuer and audience in
.env— do not inline literal values or pass them as arguments here.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 }); });Add RBAC (optional) — use
requiredScopes()orclaimIncludes()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:
requiredScopesaccepts 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. UserequiredScopes('read:msg write:msg')orrequiredScopes(['read:msg', 'write:msg'])instead.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 200Failcheck: If the server fails to start or tokens are rejected unexpectedly, check
references/api.mdfor common issues. After 5-6 failed iterations, useAskUserQuestionto 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
- auth0-express — For Express web apps with login UI (sessions, cookies)
- auth0-nextjs — For Next.js server-side web apps
- auth0-aspnetcore-api — BACKEND_API reference implementation for .NET
- go-jwt-middleware — JWT middleware for Go APIs
- auth0-api-python — JWT validation for Python APIs (Flask/FastAPI)
- auth0-cli — Manage Auth0 resources from the terminal
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 による自動翻訳です。