auth0-express について
express-openid-connect を使って、Express.js のサーバーアプリに Auth0 認証を追加するガイドです。セッション認証、保護されたルート、外部 API 用のアクセストークン設定を扱います。
主な機能
- 01express-openid-connect ミドルウェアの設定
- 02ログイン・ログアウト・コールバックの作成
- 03ミドルウェアによるルート保護
- 04外部 API 用トークンの設定
活用シーン
- 01Express.js サイトへの Auth0 ログイン追加
- 02特定ルートへのアクセス制限
- 03アクセストークンで下流 API を呼び出す
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ auth0/ agent-skills --skill auth0-expressインストール後、Claude Code で/auth0-expressを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/api.mdintegration.mdsetup.md詳細
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 # only required if calling external APIs (Step 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();
// 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');
});
外部 API を呼び出しますか? 下流の API 用にアクセストークンが必要な場合は、
authorizationParamsを追加する必要があります。詳しくは以下のステップ 3a を参照してください。
これにより、次のエンドポイントが自動的に作成されます。
/login- ログインエンドポイント/logout- ログアウトエンドポイント/callback- OAuth コールバック
3a. API アクセス用のミドルウェアを設定する(外部 API を呼び出す場合)
外部 API 用のアクセストークンが必要な場合、audience は必ず authorizationParams の中に指定してください。最上位に指定すると無視され、アクセストークンは発行されません。
// 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'
}
}));
続いて、ルートでトークンにアクセスします。
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. ルートを追加する
// 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. 認証をテストする
サーバーを起動します。
node app.js
http://localhost:3000 にアクセスして、ログインのフローをテストしてください。
詳細なドキュメント
- セットアップガイド - 自動セットアップスクリプト、環境設定、Auth0 CLI の使用方法
- 統合ガイド - 保護されたルート、セッション、API 統合、エラー処理
- API リファレンス - ミドルウェア API 全般、設定オプション、リクエストのプロパティ
よくある間違い
| 間違い | 修正方法 |
|---|---|
| Auth0 Dashboard にコールバック 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 Dashboard の Allowed Logout URLs にドメインを追加します |
audience を最上位の設定キーとして指定する | audience を response_type: 'code' および scope とともに authorizationParams の中へ移動します。最上位の audience は無視され、アクセストークンは発行されません |
req.oidc.accessToken を文字列として使用する | これはオブジェクトです。const { access_token } = req.oidc.accessToken で分割代入します |
関連スキル
auth0-quickstart- Auth0 の基本セットアップauth0-migration- 別の認証プロバイダーから移行するauth0-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()のメソッドも利用できます。audienceとresponse_type: 'code'を含むauthorizationParamsが設定されている場合にのみ値が格納されますreq.oidc.idToken- ID トークンreq.oidc.refreshToken- リフレッシュトークン
一般的なユースケース:
- 保護されたルート →
requiresAuth()ミドルウェアを使用します(ステップ 4 を参照) - 認証状態の確認 →
req.oidc.isAuthenticated() - ユーザー情報の取得 →
req.oidc.user - API の呼び出し → 統合ガイド