Contents
Auth0とNext.jsの統合概要
Webアプリケーションにおけるセキュアな認証フローは、ユーザー情報保護とサービス信頼性を支える根幹です。Auth0は、OAuth 2.0とOpenID Connectを基盤とした認証インフラを提供し、Next.jsアプリケーションとの連携で開発効率とセキュリティの両立が可能です。公式SDKを活用することで、独自実装に比べて開発期間短縮や標準的なセキュリティ対策の自動適用といった利点があります。
Auth0 Next.js SDKの導入手順
Next.jsアプリケーションにAuth0を統合するには、公式SDKの導入が不可欠です。以下に必要な前提条件と設定手順をステップ形式で解説します。
SDKインストールと設定ファイル構成
Next.jsプロジェクト内にAuth0 SDKを導入し、環境変数を定義します。
-
SDKのインストール
bash
npm install @auth0/nextjs-auth0 -
auth0.config.tsの作成(例)
ts
import { Auth0Config } from '@auth0/nextjs-auth0'
const config: Auth0Config = {
domain: process.env.AUTH0_DOMAIN || '',
clientId: process.env.AUTH0_CLIENT_ID || '',
clientSecret: process.env.AUTH0_CLIENT_SECRET || '',
redirectUri: process.env.AUTH0_REDIRECT_URI || 'http://localhost:3000/api/auth/callback',
}
export default config
-
next.config.jsの設定
js
module.exports = {
// Auth0 SDKが必要な場合にのみ導入
experimental: {
appDir: true,
},
} -
環境変数の定義(
.env.local)
AUTH0_DOMAIN=your-auth0-domain.auth0.com
AUTH0_CLIENT_ID=your-client-id
AUTH0_CLIENT_SECRET=your-client-secret
AUTH0_REDIRECT_URI=http://localhost:3000/api/auth/callback
注意点:
AUTH0_CLIENT_SECRETは絶対にGitリポジトリに公開しないこと。.env.localファイルを.gitignoreに登録し、CI/CD環境ではSecrets Managerなどを活用してください。
認証フローのカスタマイズ方法
Auth0 SDKはデフォルトでログイン・サインアップ画面を提供しますが、UIやロジックをカスタム可能です。
ログイン/サインアップ画面のUI調整
Auth0のデフォルト画面に加え、独自デザインを適用する方法があります。
auth0.config.tsでテーマ指定(誤り修正済)
ts
const config: Auth0Config = {
// ...
theme: 'https://your-cdn-url/custom-theme.css',
}
注意事項: Auth0のカスタムCSSは**CDN経由での注入ではなく、UI設定画面またはManagement APIでの指定が推奨されます。公式ドキュメントを参照してください。
- カスタムコンポーネントの実装例(ログインフォーム)
ログイン時に使用するUIをcomponents/auth/Login.tsxで定義し、Auth0Providerと連携します。
ポイント: UI変更は
useAuth()フックを通じたセッション管理に影響しないため、柔軟なカスタマイズが可能です。ただし、コンポーネント構造として_app.tsxやlayout.tsxに統合する必要がある場合があります。
カスタムクレームの利用例
ユーザー情報に追加フィールド(クレーム)を含めることで、アプリケーション側でのロジック拡張が可能になります。以下はauth0.config.tsにカスタムクレームを指定する例です。
|
1 2 3 4 5 6 7 8 |
const config: Auth0Config = { // ... claims: { email_verified: 'email_verified', role: 'https://your-app.com/role', }, } |
ユーザーセッション管理のベストプラクティス
トークン有効期限やブラウザストレージの安全性は、セキュリティ設計における重要な要素です。
トークンの有効期限管理
Auth0ではデフォルトでアクセストークンの有効期限が1時間、IDトークンは5分となります。アプリケーション側で自動更新を行うには、以下の処理を実装します。
- アクセストークンリフレッシュロジック(例)
ts
import { useAuth } from '@auth0/nextjs-auth0'
const AuthChecker = () => {
const { user, isLoading, error } = useAuth()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
if (isLoading) return <div>認証中...</div> if (error) return <div>認証エラー: {error.message}</div> // IDトークンの有効期限を確認 const expiresAt = user?.exp * 1000 const isExpired = Date.now() > expiresAt if (isExpired) { return <div>セッションが切れました。再度ログインしてください。</div> } return <div>認証済み</div> |
}
構成の注意: このコンポーネントは
LayoutやAppコンポーネント内で定義し、アプリケーション全体に適用する必要があります。
ブラウザストレージの安全確保
トークンをlocalStorageまたはsessionStorageに保存する際、セキュリティリスクが発生しやすいため注意が必要です。
| ストレージタイプ | 説明 | 推奨用途 |
|---|---|---|
localStorage |
ページ再読み込み時に保持される | 非常によく使われるが、XSSに弱い |
sessionStorage |
タブ終了時まで保存される | セキュリティを重視する場合 |
注意: トークンは可能な限り短期間で有効期限を設定し、セッションストレージの使用が推奨されます。
セキュリティ設定(CORS/CSRF対策)
Auth0 SDKにはCORSやCSRF対策が組み込まれていますが、アプリケーション側での補足も重要です。
Auth0管理画面でのオリジン設定
- Auth0ダッシュボード → 「Applications」→「Settings」にアクセス
- 「Allowed Callback URLs」に
http://localhost:3000/api/auth/callbackを追加 - 「Allowed Web Origins」に
http://localhost:3000を登録
注意: 本番環境では、ドメイン名(例:
https://yourdomain.com)を指定してください。また、CORSの設定はNext.js側でも必要です。
Next.jsアプリケーションの保護方法
Next.jsでAuth0と連携する際には、以下のような補足対策を実施します。
- APIルートでの認証チェック(例)
ts
// pages/api/auth/[...auth0].ts
import { handleAuth } from '@auth0/nextjs-auth0'
export default handleAuth()
- 保護されたページコンポーネントの実装例
tsx
import { getSession } from '@auth0/nextjs-auth0'
import { useRouter } from 'next/router'
const ProtectedPage = () => {
const router = useRouter()
|
1 2 3 4 5 6 7 8 9 |
// セッション情報を取得 const session = await getSession() if (!session) { router.push('/login') return null } return <div>認証済みユーザー専用ページ</div> |
}
CORS対策: Next.jsアプリケーション内で、APIルートに
corsミドルウェアを追加し、リクエスト元のオリジンを制限します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// pages/api/auth/[...auth0].ts import { handleAuth } from '@auth0/nextjs-auth0' import cors from 'cors' const corsOptions = { origin: ['http://localhost:3000', 'https://yourdomain.com'], } export default async function handler(req, res) { await cors(corsOptions)(req, res) return handleAuth(req, res) } |
Next.jsアプリケーションとの連携サンプルコード
以下に、Auth0 SDKを活用したNext.jsアプリケーションの実装例を示します。
APIルートの認証処理例
Auth0が提供するhandleAuth()関数をAPIルートで使用し、認証フローを制御します。
|
1 2 3 4 5 |
// pages/api/auth/[...auth0].ts import { handleAuth } from '@auth0/nextjs-auth0' export default handleAuth() |
保護されたページコンポーネント実装
以下のようにuseEffectでセッション情報を取得し、認証状態をチェックします。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import { useEffect, useState } from 'react' import { useAuth } from '@auth0/nextjs-auth0' const ProtectedComponent = () => { const [user, setUser] = useState(null) const { user: authUser, isLoading, error } = useAuth() useEffect(() => { if (isLoading) return if (error) { console.error('認証エラー:', error) return } setUser(authUser) }, [authUser, isLoading, error]) if (!user) { return <div>認証されていません。ログインしてください。</div> } return ( <div> <h1>ユーザー情報</h1> <p>{user.name}</p> <p>{user.email}</p> </div> ) } |
SDKバージョンの注意点
Auth0 SDKのバージョン依存性に関する注意喚起が不足しています。@auth0/nextjs-auth0のv2.xはNext.js v13以降との互換性があるものの、特定バージョンのSDK(例:v2.5)ではNext.js v14で問題が出る可能性があります。公式ドキュメントまたはnpmページを参照し、アプリケーションのNext.jsバージョンと一致するSDKバージョンを使用してください。