🔐auth0-express
- プラグイン
- auth0
- ライセンス
- Apache-2.0
- ソース
- GitHub で見る ↗
説明
次のような場合に使用: Express.js Webアプリケーションにセッションベースのログイン・ログアウト機能や、保護されたルートを追加するとき。 `express-openid-connect` を統合します。ユーザーが「Expressアプリにログインを追加して」や「Expressのルートを保護して」と言った場合にも使用してください。
原文を表示
Use when adding session-based login, logout, or protected routes to an Express.js web application. Integrates express-openid-connect — use even if the user says "add login to my Express app" or "protect my Express routes".
ユースケース
- ✓Express.jsにセッションベースのログイン機能を追加するとき
- ✓Express.jsにログアウト機能を追加するとき
- ✓Express.jsのルートを保護するとき
- ✓express-openid-connectを統合するとき
本文(日本語訳)
Auth0 Express インテグレーション
express-openid-connect を使用して、Express.js Webアプリケーションに認証機能を追加します。
前提条件
- Express.js アプリケーション
- Auth0 アカウントおよびアプリケーションの設定済み環境
- Auth0 がまだセットアップされていない場合は、先に
auth0-quickstartスキルを使用してください
使用しない場合
- シングルページアプリケーション — クライアントサイド認証には
auth0-react、auth0-vue、またはauth0-angularを使用 - Next.js アプリケーション — クライアント・サーバー両方を扱う
auth0-nextjsスキルを使用 - モバイルアプリケーション — React Native / Expo には
auth0-react-nativeを使用 - ステートレス API — セッションベース認証の代わりに JWT バリデーションミドルウェアを使用
- マイクロサービス — サービス間認証には JWT バリデーションを使用
クイックスタート手順
1. SDK のインストール
npm install express-openid-connect dotenv
2. 環境設定
Auth0 CLI を使った自動セットアップについては、完全なスクリプトが記載された セットアップガイド を参照してください。
手動セットアップの場合:
.env を作成します:
SECRET=<openssl-rand-hex-32>
BASE_URL=http://localhost:3000
CLIENT_ID=your-client-id
CLIENT_SECRET=your-client-secret
ISSUER_BASE_URL=https://your-tenant.auth0.com
AUDIENCE=https://your-api-identifier # 外部APIを呼び出す場合のみ必要(ステップ 3a)
シークレットの生成: openssl rand -hex 32
3. 認証ミドルウェアの設定
Express アプリ(app.js または index.js)を更新します:
require('dotenv').config();
const express = require('express');
const { auth, requiresAuth } = require('express-openid-connect');
const app = express();
// Auth0 ミドルウェアの設定
app.use(auth({
authRequired: false, // 全ルートで認証を必須にしない
auth0Logout: true, // ログアウトエンドポイントを有効化
secret: process.env.SECRET,
baseURL: process.env.BASE_URL,
clientID: process.env.CLIENT_ID,
issuerBaseURL: process.env.ISSUER_BASE_URL,
clientSecret: process.env.CLIENT_SECRET
}));
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
外部 API を呼び出す場合: ダウンストリーム API 用のアクセストークンが必要な場合は、
authorizationParamsを必ず追加してください — 下記のステップ 3a を参照してください。
これにより、以下のエンドポイントが自動的に作成されます:
/login— ログインエンドポイント/logout— ログアウトエンドポイント/callback— OAuth コールバック
3a. API アクセス用ミドルウェアの設定(外部 API を呼び出す場合)
外部 API 用のアクセストークンが必要な場合、audience は authorizationParams の内部に記述する必要があります。
トップレベルに設定しても暗黙的に無視され、アクセストークンは発行されません。
// SDK は環境変数から SECRET, BASE_URL, CLIENT_ID, ISSUER_BASE_URL, CLIENT_SECRET を自動的に読み込みます
app.use(auth({
authRequired: false,
auth0Logout: true,
authorizationParams: { // ← アクセストークンに必要
response_type: 'code', // ← 必須: 認可コードフロー
audience: process.env.AUDIENCE, // ← API識別子(トップレベルに置かないこと)
scope: 'openid profile email'
}
}));
ルート内でのトークン取得:
app.get('/api-call', requiresAuth(), async (req, res) => {
const { access_token } = req.oidc.accessToken; // オブジェクトであり、文字列ではない
const response = await fetch('https://your-api.com/data', {
headers: { Authorization: `Bearer ${access_token}` }
});
res.json(await response.json());
});
4. ルートの追加
// パブリックルート
app.get('/', (req, res) => {
res.send(req.oidc.isAuthenticated() ? 'Logged in' : 'Logged out');
});
// 保護されたルート
app.get('/profile', requiresAuth(), (req, res) => {
res.send(`
<h1>Profile</h1>
<p>Name: ${req.oidc.user.name}</p>
<p>Email: ${req.oidc.user.email}</p>
<pre>${JSON.stringify(req.oidc.user, null, 2)}</pre>
<a href="/logout">Logout</a>
`);
});
// ログイン/ログアウトリンク
app.get('/', (req, res) => {
res.send(`
${req.oidc.isAuthenticated() ? `
<p>Welcome, ${req.oidc.user.name}!</p>
<a href="/profile">Profile</a>
<a href="/logout">Logout</a>
` : `
<a href="/login">Login</a>
`}
`);
});
5. 認証のテスト
サーバーを起動します:
node app.js
http://localhost:3000 にアクセスし、ログインフローをテストしてください。
詳細ドキュメント
- セットアップガイド — 自動セットアップスクリプト、環境設定、Auth0 CLI の使い方
- インテグレーションガイド — 保護されたルート、セッション、API インテグレーション、エラーハンドリング
- API リファレンス — ミドルウェア API の全詳細、設定オプション、リクエストプロパティ
よくある間違い
| 間違い | 対処法 |
|---|---|
| Auth0 ダッシュボードへのコールバック URL の追加忘れ | Allowed Callback URLs に /callback パスを追加(例: http://localhost:3000/callback) |
| SECRET が未設定または脆弱 | openssl rand -hex 32 でセキュアなシークレットを生成し、.env に SECRET として保存 |
authRequired: true をグローバルに設定している |
false に設定し、特定のルートに requiresAuth() ミドルウェアを個別に適用する |
| Auth0 でアプリを SPA タイプとして作成している | サーバーサイド認証には Regular Web Application タイプを使用する必要がある |
| セッションシークレットをコードに直接記述している | 常に環境変数を使用し、シークレットをハードコードしない |
| 本番環境の baseURL が誤っている | BASE_URL を本番ドメインに合わせて更新する |
| ログアウト後の returnTo が未処理 | Auth0 ダッシュボードの Allowed Logout URLs に自ドメインを追加する |
audience をトップレベルの設定キーとして指定している |
audience を authorizationParams 内に移動し、response_type: 'code' と scope も合わせて設定する — トップレベルの audience は暗黙的に無視され、アクセストークンは発行されない |
req.oidc.accessToken を文字列として使用している |
これはオブジェクトです — const { access_token } = req.oidc.accessToken のように分割代入で取得してください |
関連スキル
auth0-quickstart— Auth0 の基本セットアップauth0-migration— 別の認証プロバイダーからの移行auth0-mfa— 多要素認証(MFA)の追加auth0-cli— ターミナルから Auth0 リソースを管理
クイックリファレンス
ミドルウェアオプション:
authRequired— 全ルートで認証を必須にする(デフォルト: false)auth0Logout—/logoutエンドポイントを有効化(デフォルト: false)secret— セッションシークレット(必須)baseURL— アプリケーション URL(必須)clientID— Auth0 クライアント ID(必須)issuerBaseURL— Auth0 テナント URL(必須)
リクエストプロパティ:
req.oidc.isAuthenticated()— ユーザーのログイン状態を確認req.oidc.user— ユーザープロファイルオブジェクトreq.oidc.accessToken— アクセストークンオブジェクト({ access_token, token_type, expires_in })。expires_inは残り秒数。const { access_token } = req.oidc.accessTokenで分割代入して使用。isExpired()およびrefresh()メソッドも公開されている。authorizationParamsにaudienceとresponse_type: 'code'が設定されている場合のみ値が入るreq.oidc.idToken— ID トークンreq.oidc.refreshToken— リフレッシュトークン
主なユースケース:
- 保護されたルート →
requiresAuth()ミドルウェアを使用(ステップ 4 参照) - 認証状態の確認 →
req.oidc.isAuthenticated() - ユーザー情報の取得 →
req.oidc.user - API の呼び出し → インテグレーションガイド
参考資料
原文(English)を表示
Auth0 Express Integration
Add authentication to Express.js web applications using express-openid-connect.
Prerequisites
- Express.js application
- Auth0 account and application configured
- If you don't have Auth0 set up yet, use the
auth0-quickstartskill first
When NOT to Use
- Single Page Applications - Use
auth0-react,auth0-vue, orauth0-angularfor client-side auth - Next.js applications - Use
auth0-nextjsskill which handles both client and server - Mobile applications - Use
auth0-react-nativefor React Native/Expo - Stateless APIs - Use JWT validation middleware instead of session-based auth
- Microservices - Use JWT validation for service-to-service auth
Quick Start Workflow
1. Install SDK
npm install express-openid-connect dotenv
2. Configure Environment
For automated setup with Auth0 CLI, see Setup Guide for complete scripts.
For manual setup:
Create .env:
SECRET=<openssl-rand-hex-32>
BASE_URL=http://localhost:3000
CLIENT_ID=your-client-id
CLIENT_SECRET=your-client-secret
ISSUER_BASE_URL=https://your-tenant.auth0.com
AUDIENCE=https://your-api-identifier # only required if calling external APIs (Step 3a)
Generate secret: openssl rand -hex 32
3. Configure Auth Middleware
Update your Express app (app.js or index.js):
require('dotenv').config();
const express = require('express');
const { auth, requiresAuth } = require('express-openid-connect');
const app = express();
// Configure Auth0 middleware
app.use(auth({
authRequired: false, // Don't require auth for all routes
auth0Logout: true, // Enable logout endpoint
secret: process.env.SECRET,
baseURL: process.env.BASE_URL,
clientID: process.env.CLIENT_ID,
issuerBaseURL: process.env.ISSUER_BASE_URL,
clientSecret: process.env.CLIENT_SECRET
}));
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
Calling external APIs? If you need an access token for a downstream API, you must add
authorizationParams— see Step 3a below.
This automatically creates:
/login- Login endpoint/logout- Logout endpoint/callback- OAuth callback
3a. Configure Middleware for API Access (when calling external APIs)
When you need an access token for an external API, audience must go inside authorizationParams — putting it at the top level is silently ignored and no access token is issued.
// SDK auto-loads SECRET, BASE_URL, CLIENT_ID, ISSUER_BASE_URL, CLIENT_SECRET from env vars
app.use(auth({
authRequired: false,
auth0Logout: true,
authorizationParams: { // ← required for access tokens
response_type: 'code', // ← required: authorization code flow
audience: process.env.AUDIENCE, // ← API identifier (never top-level)
scope: 'openid profile email'
}
}));
Then access the token in your route:
app.get('/api-call', requiresAuth(), async (req, res) => {
const { access_token } = req.oidc.accessToken; // object, not a string
const response = await fetch('https://your-api.com/data', {
headers: { Authorization: `Bearer ${access_token}` }
});
res.json(await response.json());
});
4. Add Routes
// Public route
app.get('/', (req, res) => {
res.send(req.oidc.isAuthenticated() ? 'Logged in' : 'Logged out');
});
// Protected route
app.get('/profile', requiresAuth(), (req, res) => {
res.send(`
<h1>Profile</h1>
<p>Name: ${req.oidc.user.name}</p>
<p>Email: ${req.oidc.user.email}</p>
<pre>${JSON.stringify(req.oidc.user, null, 2)}</pre>
<a href="/logout">Logout</a>
`);
});
// Login/logout links
app.get('/', (req, res) => {
res.send(`
${req.oidc.isAuthenticated() ? `
<p>Welcome, ${req.oidc.user.name}!</p>
<a href="/profile">Profile</a>
<a href="/logout">Logout</a>
` : `
<a href="/login">Login</a>
`}
`);
});
5. Test Authentication
Start your server:
node app.js
Visit http://localhost:3000 and test the login flow.
Detailed Documentation
- Setup Guide - Automated setup scripts, environment configuration, Auth0 CLI usage
- Integration Guide - Protected routes, sessions, API integration, error handling
- API Reference - Complete middleware API, configuration options, request properties
Common Mistakes
| Mistake | Fix |
|---|---|
| Forgot to add callback URL in Auth0 Dashboard | Add /callback path to Allowed Callback URLs (e.g., http://localhost:3000/callback) |
| Missing or weak SECRET | Generate secure secret with openssl rand -hex 32 and store in .env as SECRET |
| Setting authRequired: true globally | Set to false and use requiresAuth() middleware on specific routes |
| App created as SPA type in Auth0 | Must be Regular Web Application type for server-side auth |
| Session secret exposed in code | Always use environment variables, never hardcode secrets |
| Wrong baseURL for production | Update BASE_URL to match your production domain |
| Not handling logout returnTo | Add your domain to Allowed Logout URLs in Auth0 Dashboard |
audience as a top-level config key |
Move audience inside authorizationParams with response_type: 'code' and scope — top-level audience is silently ignored, no access token is issued |
req.oidc.accessToken used as a string |
It is an object — destructure with const { access_token } = req.oidc.accessToken |
Related Skills
auth0-quickstart- Basic Auth0 setupauth0-migration- Migrate from another auth providerauth0-mfa- Add Multi-Factor Authenticationauth0-cli- Manage Auth0 resources from the terminal
Quick Reference
Middleware Options:
authRequired- Require auth for all routes (default: false)auth0Logout- Enable /logout endpoint (default: false)secret- Session secret (required)baseURL- Application URL (required)clientID- Auth0 client ID (required)issuerBaseURL- Auth0 tenant URL (required)
Request Properties:
req.oidc.isAuthenticated()- Check if user is logged inreq.oidc.user- User profile objectreq.oidc.accessToken- Access token object ({ access_token, token_type, expires_in });expires_inis seconds remaining. Destructure withconst { access_token } = req.oidc.accessToken. Also exposesisExpired()andrefresh()methods. Only populated whenauthorizationParamswithaudience+response_type: 'code'is configuredreq.oidc.idToken- ID tokenreq.oidc.refreshToken- Refresh token
Common Use Cases:
- Protected routes → Use
requiresAuth()middleware (see Step 4) - Check auth status →
req.oidc.isAuthenticated() - Get user info →
req.oidc.user - Call APIs → Integration Guide
References
原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。