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

在NextAuth中通过signIn传自定义值并在IdentityServer4 Provider中使用

解决NextAuth动态修改IdentityServer4登录策略的问题

1. 客户端传递自定义登录策略参数

在客户端组件的signIn调用中,通过第三个参数传入自定义的login_resolution_policy值:

// 客户端组件示例
<button onClick={() => signIn('identity-server4', undefined, { login_resolution_policy: 'email' })}>
  使用邮箱登录
</button>
<button onClick={() => signIn('identity-server4', undefined, { login_resolution_policy: 'username' })}>
  使用用户名登录
</button>

2. 在NextAuth配置中动态获取参数并修改Provider

在options.ts里,将IdentityServer4 Provider的authorization配置改为函数形式,从上下文参数中提取客户端传入的策略值,动态拼接授权URL参数:

// options.ts
import NextAuth from "next-auth";
import IdentityServer4Provider from "next-auth/providers/identity-server4";

export const authOptions = {
  providers: [
    IdentityServer4Provider({
      clientId: process.env.IDENTITY_SERVER_CLIENT_ID!,
      clientSecret: process.env.IDENTITY_SERVER_CLIENT_SECRET!,
      issuer: process.env.IDENTITY_SERVER_ISSUER!,
      authorization: async ({ params }) => {
        // 获取客户端传入的策略,默认设为用户名登录
        const loginPolicy = params?.login_resolution_policy || "username";
        return {
          url: `${process.env.IDENTITY_SERVER_ISSUER}/connect/authorize`,
          params: {
            scope: "openid profile email",
            login_resolution_policy: loginPolicy, // 动态注入策略参数
          },
        };
      },
    }),
  ],
  // 可选:若需将策略信息存入session/jwt,可添加以下回调
  callbacks: {
    async jwt({ token, account }) {
      if (account?.params?.login_resolution_policy) {
        token.loginPolicy = account.params.login_resolution_policy;
      }
      return token;
    },
    async session({ session, token }) {
      session.loginPolicy = token.loginPolicy;
      return session;
    },
  },
};

export default NextAuth(authOptions);

3. 验证参数传递

启动项目后点击登录链接,查看IdentityServer4收到的授权请求,确认login_resolution_policy参数已正确携带。也可在NextAuth的authorization函数中添加日志打印,验证参数是否被正确获取。

内容的提问来源于stack exchange,提问作者Krishna Mistry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:24:51