Next.js应用中使用NextAuth对接Keycloak登录失败:[next-auth][error][SIGNIN_OAUTH_ERROR]
Next.js应用中使用NextAuth对接Keycloak登录失败:[next-auth][error][SIGNIN_OAUTH_ERROR]
兄弟,我之前踩过NextAuth+Keycloak的坑,咱们一步步来排查这个问题!
先把环境变量和Keycloak客户端配置这基础项盯紧
- Issuer地址别写错:
KEYCLOAK_ISSUER必须是Keycloak realm的完整URL,比如http://localhost:8080/realms/你的realm名称,很多人容易漏掉后面的/realms/xxx,这会直接导致OAuth握手失败。 - 客户端信息要对应:确认
KEYCLOAK_CLIENT_ID和KEYCLOAK_CLIENT_SECRET是你在Keycloak里创建的客户端的准确值,而且这个客户端的Access Type必须设为confidential——因为NextAuth用的是Authorization Code Flow,需要客户端密钥才能完成认证。 - 环境变量加载正常:检查你的
.env.local文件里变量名有没有拼写错误,比如是不是把KEYCLOAK_CLIENT_ID写成了KEYCLOAK_CLIENTID?Next.js只会自动加载.env.local里的变量,别放错文件了。
Keycloak客户端的重定向URI必须精准匹配
这是最容易踩的坑之一!在Keycloak客户端的Valid Redirect URIs里,必须添加NextAuth的回调地址:
- 本地开发的话是
http://localhost:3000/api/auth/callback/keycloak(如果你的Next.js端口不是3000,记得改端口); - 线上环境要换成你的域名,比如
https://你的域名.com/api/auth/callback/keycloak。
要是这里不匹配,Keycloak会直接拒绝授权,NextAuth就会抛出SIGNIN_OAUTH_ERROR。
你的代码回调函数有小问题,我帮你修正下
看你贴的代码,jwt和session回调都有不完整或者冗余的地方:
// pages/api/auth/[...nextauth].js import NextAuth from "next-auth"; import KeycloakProvider from "next-auth/providers/keycloak"; export default NextAuth({ providers: [ KeycloakProvider({ clientId: process.env.KEYCLOAK_CLIENT_ID, clientSecret: process.env.KEYCLOAK_CLIENT_SECRET, issuer: process.env.KEYCLOAK_ISSUER, }), ], session: { jwt: true, }, debug: true, // 保持开启,方便看日志 callbacks: { async jwt({ token, account, user }) { // 第一次登录时,account和user才会存在 if (account && user) { token.accessToken = account.access_token; token.user = user; // 把Keycloak返回的用户信息存到token里 } return token; }, async session({ session, token }) { // 把token里的信息同步到session,方便前端使用 session.accessToken = token.accessToken; session.user = token.user; return session; }, }, });
你之前的token.user = token.user;完全是冗余的,而且session回调没写完,这样前端拿不到用户信息,也可能导致认证流程异常。
利用debug日志定位具体问题
你已经开了debug: true,启动Next.js后,终端会输出非常详细的OAuth流程日志。比如如果是clientSecret错误,日志会提示“invalid client secret”;如果是issuer不对,会提示“issuer validation failed”。这些日志是定位问题最快的方式,一定要仔细看!
最后检查网络请求
打开浏览器开发者工具的Network标签,点击登录按钮后,观察:
- 跳转到Keycloak的请求有没有成功返回登录页面;
- 登录完成后回调到
/api/auth/callback/keycloak的请求有没有4xx/5xx错误;
如果有错误,看响应内容,Keycloak通常会给出明确的错误提示。
备注:内容来源于stack exchange,提问作者J.K.A.
相关产品推荐
相关产品推荐

