useSession 未按预期返回数据

问题描述 投票:0回答:1

更新

现在可以了。我所需要改变的是

session: {
  jwt: true,
  strategy: "jwt"
}

我是 next-auth 的新手。我正在使用 MongoDB 作为数据库来练习使用凭据进行下一个身份验证登录。每当我使用凭据登录时,useSession 不会按预期返回数据,但如果使用 google 和 GitHub 等其他提供商登录,它会按预期返回数据。下面我给出了我的代码。

[...nextauth.js] 代码:-

export default NextAuth({
  // Configure one or more authentication providers
  adapter: MongoDBAdapter(clientPromise),
  session: {
    jwt: true,
  },
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_ID,
      clientSecret: process.env.GOOGLE_SECRET,
    }),
    CredentialsProvider({
      async authorize(credentials) {
        const client = await connect();
        const usersCollection = client.db().collection("users");

        const user = await usersCollection.findOne({
          email: credentials.email,
        });

        if (!user) {
          client.close();
          throw new Error("No user found!");
        }

        const isValid = bcrypt.compare(credentials.password, user.password);

        if (!isValid) {
          client.close();
          throw new Error("Invalid password/email");
        }
        client.close();
        return user;
      },
    }),
    // ...add more providers here
  ],
  callbacks: {
    async session({ session, user, token }) {
      session.user = token.user;
      console.log(user)

      return session
    },
    async jwt({ token, user }) {
      if (user) {
        token.user = user;
      }
      // console.log(token)
      return token
    },
  },
});

签到逻辑:

const handleSubmit = async (e) => {
    e.preventDefault();
    const status = await signIn("credentials", {
      redirect: false,
      email: emailRef.current.value,
      password: passwordRef.current.value,
      
    });
    console.log(status); // {error: null, status: 200, ok: true, url: 'http://localhost:3000/login'}
    console.log(session); // {data: null, status: 'unauthenticated'}
  };

抱歉我的英语不好。 提前致谢。 :)

reactjs next.js next-auth
1个回答
0
投票

这个方法对我有用:1)首先修改令牌2)将信息传递给会话。代码

callbacks: {
    async jwt({ token, account, user, profile }) {
      // Persist the OAuth access_token to the token right after signin
      if (account) {
        token.accessToken = user?.apiToken;
        token.Role = user?.Role;
      }

      return token;
    },
    async session({ session, token }) {
      // Send properties to the client, like an access_token from a provider.
      console.log("token", token);
      session.user.accessToken = token.accessToken;
      session.user.Role = token.Role;
      console.log("session now", session);
      return session;
    },
  },
© www.soinside.com 2019 - 2024. All rights reserved.