claude-skills/

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

last sync 22h ago
スキルOfficialsecurity

🔐auth0-express

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

説明

次のような場合に使用: 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-reactauth0-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 用のアクセストークンが必要な場合、audienceauthorizationParams内部に記述する必要があります。 トップレベルに設定しても暗黙的に無視され、アクセストークンは発行されません。

// 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 ダッシュボードへのコールバック URL の追加忘れ Allowed Callback URLs に /callback パスを追加(例: http://localhost:3000/callback
SECRET が未設定または脆弱 openssl rand -hex 32 でセキュアなシークレットを生成し、.envSECRET として保存
authRequired: true をグローバルに設定している false に設定し、特定のルートに requiresAuth() ミドルウェアを個別に適用する
Auth0 でアプリを SPA タイプとして作成している サーバーサイド認証には Regular Web Application タイプを使用する必要がある
セッションシークレットをコードに直接記述している 常に環境変数を使用し、シークレットをハードコードしない
本番環境の baseURL が誤っている BASE_URL を本番ドメインに合わせて更新する
ログアウト後の returnTo が未処理 Auth0 ダッシュボードの Allowed Logout URLs に自ドメインを追加する
audience をトップレベルの設定キーとして指定している audienceauthorizationParams 内に移動し、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() メソッドも公開されている。authorizationParamsaudienceresponse_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-quickstart skill first

When NOT to Use

  • Single Page Applications - Use auth0-react, auth0-vue, or auth0-angular for client-side auth
  • Next.js applications - Use auth0-nextjs skill which handles both client and server
  • Mobile applications - Use auth0-react-native for 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 setup
  • auth0-migration - Migrate from another auth provider
  • auth0-mfa - Add Multi-Factor Authentication
  • auth0-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 in
  • req.oidc.user - User profile object
  • req.oidc.accessToken - Access token object ({ access_token, token_type, expires_in }); expires_in is seconds remaining. Destructure with const { access_token } = req.oidc.accessToken. Also exposes isExpired() and refresh() methods. Only populated when authorizationParams with audience + response_type: 'code' is configured
  • req.oidc.idToken - ID token
  • req.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 による自動翻訳です。