GitHub 認証ログインエラー:issuer の欠落または不一致の問題の根本原因と解決策
NextAuth.js (または Auth.js) を使用して GitHub ログインを統合したプロジェクトで、認証コールバック時に「issuer validation failed」というエラーが頻発しています。
レンダリング中...
最近、NextAuth.js(または Auth.js)を使用してGitHubログインを統合したプロジェクトで、認証コールバック段階で頻繁にエラーが発生しています(よくあるのは `unexpected iss parameter`、`checks.state mismatch`、または `issuer validation failed`)。この問題は、GitHub公式のセキュリティプロトコルアップグレードと、基盤となる依存ライブラリの検証メカニズムとの間の競合に起因します。
**問題の根本原因分析**
1. **RFC 9207 防御仕様の導入**:GitHubは最近、OAuth認証フローにおいて **RFC 9207**(OAuth 2.0 認証サーバー発行者識別子仕様)に完全に準拠しました。ユーザーが認証に成功し、アプリケーションにリダイレクトされる際、コールバックURLパラメータには `iss` フィールドが強制的に含まれるようになりました(例: `?code=xxx&state=xxx&iss=[https://github.com/login/oauth](https://github.com/login/oauth)`)。これはOAuth混合攻撃(Mix-Up Attacks)を防ぐためです。
2. **openid-client の厳格な検証**:NextAuthは、OAuth/OIDC認証を処理するために基盤となる `openid-client` に依存しています。`openid-client` がコールバックURL内の `iss` パラメータを受け取ると、Provider設定に一致する `issuer` が存在することを強制し、両者の値が一致するかどうかを検証します。
3. **組み込み Provider 設定の遅延**:NextAuthの一部のバージョン(特にv4および初期のv5バージョン)では、プリセットの `GitHubProvider` 定義にデフォルトの `issuer` 宣言が欠けており、`openid-client` が一致検証を完了できず、直接例外をスローしていました。
**解決策**
NextAuthの設定ファイルで、`GitHubProvider` に `issuer` パラメータを明示的に追加し、`[https://github.com/login/oauth](https://github.com/login/oauth)` と指定します。
**`GithubProvider.default` 設定の使用(カスタム/ランタイム環境で一般的):**
```TypeScript
import GithubProvider from "next-auth/providers/github";
GithubProvider.default({
clientId: runtimeConfig.github.clientId,
clientSecret: runtimeConfig.github.clientSecret,
// GitHubはRFC 9207に従ってコールバックでissを返します。openid-clientはissuerと一致することを要求します
issuer: "https://github.com/login/oauth",
httpOptions: {
timeout: 30000,
},
});
```
**通常の標準設定(NextAuth v4 / v5 デフォルトエクスポート):**
```TypeScript
import GithubProvider from "next-auth/providers/github";
GithubProvider({
clientId: process.env.GITHUB_ID!,
clientSecret: process.env.GITHUB_SECRET!,
// コールバックのissパラメータと一致するようにissuerを明示的に指定します
issuer: "https://github.com/login/oauth",
httpOptions: {
timeout: 30000,
},
});
```
**設定に関する注意事項**
- **URL形式の厳密な一致**:`issuer` は厳密に `[https://github.com/login/oauth](https://github.com/login/oauth)` と記述する必要があり、`[https://github.com](https://github.com)` に変更したり、パスを省略したりすることはできません。そうしないと、`openid-client` の文字列比較が失敗します。
- **ネットワークタイムアウト設定**:`httpOptions: { timeout: 30000 }` を保持することで、サーバーレス関数(Vercel/Cloudflare Workersなど)や制限されたネットワーク環境で、GitHub OAuth APIの応答が遅延することによるリクエストタイムアウトを防ぐことができます。
- **今後のアップグレードに関する推奨事項**:この変更は、GitHub RFC 9207に互換性を持たせるための一時的な明示的なオーバーライドソリューションです。NextAuth / `@auth/core` を、このProviderのデフォルト定義が修正されたバージョンにアップグレードした後、アップグレードログに基づいてこの手動設定を削除するかどうかを評価できます。END
コメント
ログインしてコメントを閲覧・投稿してください
ログインへ