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

NextAuth集成Strapi时Session仅返回用户Email的问题求助

解决NextAuth返回的Session User缺少额外字段的问题

问题核心是NextAuth默认只会在session.user中保留email、name、image这类标准字段,要让username等Strapi返回的自定义字段出现在session里,需要修改jwt和session两个回调函数,把额外字段从token同步到session中。

步骤1:修改JWT回调,保存完整用户字段

在jwt回调中,除了保存id和jwt,还要把Strapi返回的username、confirmed等字段都存入token:

jwt: async ({ token, user }) => {
  if (user) {
    // 将完整的用户信息合并到token中
    token.user = {
      id: user.id,
      email: user.email,
      username: user.username,
      confirmed: user.confirmed,
      blocked: user.blocked,
      createdAt: user.createdAt,
      updatedAt: user.updatedAt
    };
    token.jwt = user.jwt;
  }
  return Promise.resolve(token);
},

步骤2:修改Session回调,同步用户字段到session

在session回调中,把token里保存的完整用户信息赋值给session.user,同时保留原有的expires、jwt等字段:

session: async ({ session, token }) => {
  // 替换默认的session.user为token中保存的完整用户对象
  session.user = token.user;
  session.jwt = token.jwt;
  return Promise.resolve(session);
},

完整修改后的NextAuth配置代码

import axios from "axios";
import NextAuth from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";

export default NextAuth({
  providers: [
    CredentialsProvider({
      name: "Sign in with Email",
      credentials: {
        email: { label: "Email", type: "text" },
        password: { label: "Password", type: "password" },
      },
      async authorize(credentials, req) {
        if (credentials == null) return null;
 
        try {
          const { user, jwt } = await axios
            .post(`${process.env.STRAPI_URL}/api/auth/local`, {
              identifier: credentials.email,
              password: credentials.password,
            })
            .then((response) => response.data)
            .catch((error) => {
              console.log(error.response);
              throw new Error(error.response.data.message);
            });

          return { jwt, ...user };
        } catch (error) {
          console.warn(error);
          return null;
        }
      },
    }),
  ],
  callbacks: {
    session: async ({ session, token }) => {
      session.user = token.user;
      session.jwt = token.jwt;
      return Promise.resolve(session);
    },
    jwt: async ({ token, user }) => {
      if (user) {
        token.user = {
          id: user.id,
          email: user.email,
          username: user.username,
          confirmed: user.confirmed,
          blocked: user.blocked,
          createdAt: user.createdAt,
          updatedAt: user.updatedAt
        };
        token.jwt = user.jwt;
      }
      return Promise.resolve(token);
    },
  },
});

额外说明

  • 关于authorize里console.log不显示的问题:这个函数运行在服务器端,日志会输出到Next.js的终端控制台,而不是浏览器的开发者工具控制台,去终端里看就能看到Strapi返回的完整用户数据了。
  • 如果需要添加更多字段,直接在token.user里补充对应的属性即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:05:19