【问题标题】:How to mutate user's session in nextauth when you change user data?更改用户数据时如何在下一个身份验证中改变用户会话?
【发布时间】:2022-12-11 12:30:15
【问题描述】:

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

[...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,
  },

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

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

会话对象

    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

【问题讨论】:

  • 我也有完全一样的问题。你做了什么来实现这一目标?这让我发疯

标签: session next.js prisma next-auth


【解决方案1】:

我有同样的问题并且有一个 hacky 解决方法。在 session 回调中,从数据库中获取用户。每当检查会话 (docs) 时都会触发此回调,因此您可以在更新用户后的某个地方调用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;
}
// [...nextAuth].js
session: ({ session, token }) => {
  if (token) {
    session = await getUserFromDB(token.accessToken);
  }
  return session;
}

明显的缺点:只要检查会话,就会调用从数据库中获取用户。

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 2017-07-05
    • 2014-02-21
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多