当您更改用户数据时,如何在 nextauth 中改变用户的会话?

n9p*_*9p4 10 session next.js prisma next-auth

我想更新用户的数据,但更新用户的数据后如何使更改也出现在会话中?

[...nextauth].js

    callbacks: {
    jwt: ({ token, user }) => {
      if (user) {
        token.id = user.id;
        token.name = user.name;
        token.surname = user.surname;
        token.email = user.email;
        token.role = user.role;
      }
      // Here, check the token validity date
      if (token.tokenExpiration < Date.now()) {
        // Call the endpoint where you handle the token refresh for a user
        const user =  axios.post(
          `${process.env.API_URL}/auth/authentication/refresh`,
          {
            refreshToken: token.refreshToken,
          }
        );
        // Check for the result and update the data accordingly
        return { ...token, ...user };
      }
      return token;
    },
    session: ({ session, token }) => {
      if (token) {
        session.id = token.id;
        session.name = token.name;
        session.surname = token.surname;
        session.email = token.email;
        session.role = token.role;
      }
      return session;
    },
  },
  secret: process.env.SECRET_KEY,
  jwt: {
    secret: process.env.SECRET_KEY,
    encryption: true,
    maxAge: 5 * 60 * 1000,
  },
Run Code Online (Sandbox Code Playgroud)

api/user/index.js 这里我更新了用户内容,我应该怎么做才能更新会话对象详细信息

const updateUser = await prisma.user.update({
  where: {
    email: 'test@email.io',
  },
  data: {
    name: 'User',
  },
})
Run Code Online (Sandbox Code Playgroud)

会话对象

    name  : Company
email : test@email.io
expires : 2022-04-26T18:44:36.424Z
id  : 2
name  : Company
surname : Surname
email : test@email.io
role  : 2
Run Code Online (Sandbox Code Playgroud)

小智 1

我有同样的问题并且有一个 hacky 解决方法。在session回调中,从数据库中获取用户。每当检查会话(文档)时都会触发此回调,因此您可以在更新用户后调用,,甚至其他getSession()地方useSession()signIn()

async function getUserFromDB(accessToken) {
  // I'm not super familiar with prisma but you get the idea
  const user = await prisma.user.findUnique({
    // logic to get user
    // maybe it needs your accessToken
  });
  return user;
}
Run Code Online (Sandbox Code Playgroud)
// [...nextAuth].js
session: ({ session, token }) => {
  if (token) {
    session = await getUserFromDB(token.accessToken);
  }
  return session;
}
Run Code Online (Sandbox Code Playgroud)

明显的缺点:每当检查会话时都会调用从数据库获取用户。