You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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标签,点击登录按钮后,观察:

  1. 跳转到Keycloak的请求有没有成功返回登录页面;
  2. 登录完成后回调到/api/auth/callback/keycloak的请求有没有4xx/5xx错误;
    如果有错误,看响应内容,Keycloak通常会给出明确的错误提示。

备注:内容来源于stack exchange,提问作者J.K.A.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 09:49:34