mcpField
A
auth0-authentication

auth0-authentication

github.com/mindrallyセキュリティ287704 回インストール3 週間前に更新
リポジトリ

auth0-authentication について

開発者向けの Auth0 認証実装スキルです。安全なフロー、トークン管理、Actions、多要素認証、テストを扱い、IDE からの管理操作に使う Auth0 MCP サーバーにも触れています。

主な機能

  1. 01安全な Auth0 フローの指針
  2. 02パブリッククライアントでの PKCE
  3. 03トークン検証と更新
  4. 04Auth0 Actions のセキュリティ対策
  5. 05多要素認証とセッションの指針
  6. 06認証フローのテスト

活用シーン

  1. 01SPA やネイティブアプリのログイン実装
  2. 02サーバーサイド認証の保護
  3. 03トークン更新と多要素認証の設定
  4. 04トークン有効期限とログインフローのテスト

MCP 対応

README では、AI 支援開発向けに Auth0 が MCP サーバーを提供すると説明しています。IDE 内で自然言語による Auth0 管理操作を可能にします。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mindrally/skills --skill auth0-authentication

インストール後、Claude Code で/auth0-authenticationを入力して読み込まれたか確認します。

詳細

Auth0 認証

Auth0 認証の実装に関する専門知識を持っています。どのプロジェクトで Auth0 を使用する場合も、以下のガイドラインに従ってください。

基本原則

  • Auth0 とのすべての通信およびコールバックには、必ず HTTPS を使用してください
  • 機密設定情報(クライアントシークレット、API キー)は環境変数に保存し、コードには絶対に含めないでください
  • すべての認証フローで適切なエラー処理を実装してください
  • スコープと権限には最小権限の原則を適用してください

環境変数

# Required Auth0 Configuration
AUTH0_DOMAIN=your-tenant.auth0.com
AUTH0_CLIENT_ID=your-client-id
AUTH0_CLIENT_SECRET=your-client-secret
AUTH0_AUDIENCE=your-api-audience
AUTH0_CALLBACK_URL=https://your-app.com/callback
AUTH0_LOGOUT_URL=https://your-app.com

認証フロー

PKCE を使用する認可コードフロー(SPA とネイティブアプリに推奨)

パブリッククライアントでは、必ず PKCE を使用してください。

import { Auth0Client } from '@auth0/auth0-spa-js';

const auth0 = new Auth0Client({
  domain: process.env.AUTH0_DOMAIN,
  clientId: process.env.AUTH0_CLIENT_ID,
  authorizationParams: {
    redirect_uri: window.location.origin,
    audience: process.env.AUTH0_AUDIENCE,
  },
  cacheLocation: 'localstorage', // Use 'memory' for higher security
  useRefreshTokens: true,
});
認可コードフロー(サーバーサイドアプリケーション)
// Express.js example
const { auth } = require('express-openid-connect');

app.use(
  auth({
    authRequired: false,
    auth0Logout: true,
    secret: process.env.AUTH0_SECRET,
    baseURL: process.env.BASE_URL,
    clientID: process.env.AUTH0_CLIENT_ID,
    issuerBaseURL: `https://${process.env.AUTH0_DOMAIN}`,
  })
);

Auth0 Actions のベストプラクティス

Actions は Rules に置き換わりました。以下のガイドラインに従ってください。

Action の構造
exports.onExecutePostLogin = async (event, api) => {
  // 1. Early returns for efficiency
  if (!event.user.email_verified) {
    api.access.deny('Please verify your email before logging in.');
    return;
  }

  // 2. Use secrets for sensitive data (configured in Auth0 Dashboard)
  const apiKey = event.secrets.EXTERNAL_API_KEY;

  // 3. Minimize external calls - they affect login latency
  // 4. Never log sensitive information
  console.log(`User logged in: ${event.user.user_id}`);

  // 5. Add custom claims sparingly
  api.idToken.setCustomClaim('https://myapp.com/roles', event.authorization?.roles || []);
  api.accessToken.setCustomClaim('https://myapp.com/roles', event.authorization?.roles || []);
};
Action のセキュリティルール
  • シークレットは Action Secrets に保存し、コードに直接記述しないでください
  • 外部サービスに送信するデータを制限し、イベントオブジェクト全体を送信しないでください
  • 外部 API 呼び出しには短いタイムアウトを設定してください(デフォルトの上限は 20 秒です)
  • 認証の失敗を防ぐため、適切なエラー処理を実装してください

トークン管理

アクセストークンのベストプラクティス
// Always validate tokens server-side
const { auth, requiredScopes } = require('express-oauth2-jwt-bearer');

const checkJwt = auth({
  audience: process.env.AUTH0_AUDIENCE,
  issuerBaseURL: `https://${process.env.AUTH0_DOMAIN}/`,
  tokenSigningAlg: 'RS256',
});

// Require specific scopes
const checkScopes = requiredScopes('read:messages');

app.get('/api/private-scoped', checkJwt, checkScopes, (req, res) => {
  res.json({ message: 'Protected resource' });
});
リフレッシュトークンの設定
  • リフレッシュトークンのローテーションを有効にしてください
  • 適切なトークン有効期間を設定してください(アクセストークン:最大 1 時間、リフレッシュトークン:リスクに応じて設定)
  • クライアントでトークンを自動更新するよう実装してください

セキュリティのベストプラクティス

CSRF 対策
// State parameter is automatically handled by Auth0 SDKs
// For custom implementations, always validate the state parameter
const state = generateSecureRandomString();
sessionStorage.setItem('auth0_state', state);
リダイレクト URI のセキュリティ
  • Auth0 Dashboard ですべてのリダイレクト URI を許可リストに登録してください
  • リダイレクト URI は完全一致で照合してください
  • 本番環境ではワイルドカードのリダイレクト URI を絶対に使用しないでください
セッション管理
// Implement session timeouts
const sessionConfig = {
  absoluteDuration: 86400, // 24 hours
  inactivityDuration: 3600, // 1 hour of inactivity
};

多要素認証

// Enforce MFA for sensitive operations
exports.onExecutePostLogin = async (event, api) => {
  // Check if MFA has been completed
  if (!event.authentication?.methods?.find(m => m.name === 'mfa')) {
    // Trigger MFA challenge
    api.authentication.challengeWithAny([
      { type: 'otp' },
      { type: 'push-notification' },
    ]);
  }
};

エラー処理

try {
  await auth0.loginWithRedirect();
} catch (error) {
  if (error.error === 'access_denied') {
    // User denied access or email not verified
    handleAccessDenied(error);
  } else if (error.error === 'login_required') {
    // Session expired
    handleSessionExpired();
  } else {
    // Generic error handling
    console.error('Authentication error:', error.message);
    showUserFriendlyError();
  }
}

MCP 連携

Auth0 は、AI を活用した開発向けに MCP サーバーを提供しています。

# Initialize Auth0 MCP server for Cursor
npx @auth0/auth0-mcp-server init --client cursor

これにより、IDE 内で自然言語を使って Auth0 の管理操作を実行できます。

テスト

  • 開発には Auth0 のテストユーザーを使用してください
  • 認証フローの統合テストを実装してください
  • トークンの有効期限切れと更新のシナリオをテストしてください
  • ステージング環境で MFA フローを検証してください

避けるべき一般的なアンチパターン

  1. XSS のリスクを考慮せずにトークンを localStorage に保存する
  2. サーバー側でトークンを検証しない
  3. インプリシットフロー(非推奨)を使用する
  4. フロントエンドコードにクライアントシークレットを直接記述する
  5. 適切なログアウト(ローカルと Auth0 の両方のセッション)を実装しない
  6. API 呼び出しでトークンの有効期限切れを無視する
  7. ユーザーメタデータに過剰なデータを保存する

コメント