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
相关产品推荐
相关产品推荐

