Search code examples
next.jsnext-auth

next auth not passing all user info to the client


I am trying to have a role for the user in the session

This is what I get from session.user on the client :

{ "email": "test value" }

what I want to get :

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

For some reason I can access the role on the server side but not on the client

[...nextauth].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);

I have tried searching for how to do it and I dont see what's wrong with my code.


Solution

  • Here you are not setting the session you have to use the session callback to update the session from the returned token:

    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;
    },
    

    For some reason I can access the role on the server side but not on the client

    that's the role from the token because you have added the property role to it now you have to add properties to your session