auth0-authentication について
開発者向けの Auth0 認証実装スキルです。安全なフロー、トークン管理、Actions、多要素認証、テストを扱い、IDE からの管理操作に使う Auth0 MCP サーバーにも触れています。
主な機能
- 01安全な Auth0 フローの指針
- 02パブリッククライアントでの PKCE
- 03トークン検証と更新
- 04Auth0 Actions のセキュリティ対策
- 05多要素認証とセッションの指針
- 06認証フローのテスト
活用シーン
- 01SPA やネイティブアプリのログイン実装
- 02サーバーサイド認証の保護
- 03トークン更新と多要素認証の設定
- 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 フローを検証してください
避けるべき一般的なアンチパターン
- XSS のリスクを考慮せずにトークンを localStorage に保存する
- サーバー側でトークンを検証しない
- インプリシットフロー(非推奨)を使用する
- フロントエンドコードにクライアントシークレットを直接記述する
- 適切なログアウト(ローカルと Auth0 の両方のセッション)を実装しない
- API 呼び出しでトークンの有効期限切れを無視する
- ユーザーメタデータに過剰なデータを保存する
コメント
Markdown 対応