next.js 下一个身份验证未将所有用户信息传递到客户端

eh57zj3b  于 2023-02-12  发布在  其他
关注(0)|答案(1)|浏览(108)

我正在尝试为会话中的用户设置角色
这是我从客户机上的session.user得到的结果:

{ "email": "test value" }

我想要得到的东西

{ 
  "email": "test value",
  "role": "user"
}

由于某种原因,我可以在服务器端访问角色,但不能在客户端访问角色
[...下一次].ts:

//..
const authOptions: NextAuthOptions = {
  session: {
    strategy: "jwt",
  },
  providers: [
    CredentialsProvider({
      type: "credentials",
      credentials: {},
      async authorize(credentials, req) {
        const { email, password } = credentials as {
          email: string;
          password: string;
        };
        const saltRounds = 10;

        const db = path.join(process.cwd(), "db");

        const users = JSON.parse(fs.readFileSync(db + "/users.json", "utf-8"));

        type User = {
          id: string;
          email: string;
          name: string;
          role: "user" | "admin";
          password: string;
        };

        for (let i = 0; i < users.length; i++) {
          const e = users[i] as User;

          const emailMatch = e.email === email;

          if (emailMatch) {
            const passwordMatch = bcrypt.compareSync(password, e.password);

            if (passwordMatch) {
              console.log("user loggedin", e);

              return {
                id: e.id,
                email: e.email,
                name: e.name,
                role: e.role,
              };
            }
          }
        }

        throw new Error("Invalid email or password");
      },
    }),
  ],
  pages: {
    signIn: "/auth/signin",
  },
  callbacks: {
    jwt(params) {
      if (params.user?.role) {
        params.token.role = params.user.role;
      }
      console.log("jwt", params);
      return params.token;
    },
  },
};

export default NextAuth(authOptions);

我试着搜索如何做到这一点,我没有看到我的代码有什么问题。

1yjd4xko

1yjd4xko1#

这里您没有设置session,您必须使用会话回调从返回的token更新session

async jwt(params) {
  if (params.user?.role) {
    params.token.role = params.user.role;
  }
  if (params.user?.email) {
    params.token.email = params.user.email;
  }
  return params.token;
},
async session({ session, token }) {
  session.role = token.role;
  session.email = token.email;
  return session;
},

由于某种原因,我可以在服务器端访问角色,但不能在客户端访问角色
这是token中的角色,因为您已经向其添加了属性role,现在您必须向session添加属性

相关问题