Next-Auth getServerSession 未在 Nextjs 13.4 API 路由中检索用户数据

Sha*_*rif 7 javascript reactjs next.js next-auth next.js13

我需要访问 Next-Auth/Nextjs 13.4 API 路由中的用户会话数据。我已经配置了 JWT 和 Session 回调;但是,我在回调函数中指定的用户数据不会转换为 getServerSession 在 API 路由中拉取的数据。但是,使用 useSession() 时,会话数据确实正确反映在客户端页面中,因此我不确定问题是什么。

[...nextauth]/route.js

import { connectToDB } from "@/app/server/db";
import NextAuth from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";
import bcrypt from 'bcrypt';

// Authorize function
async function authorize(credentials) {
    const { email, password } = credentials;
    const { db } = await connectToDB("Tenants");
    const user = await db.collection("Users").findOne({ email });

    if (user) {
        const isPasswordValid = await bcrypt.compare(password, user.password);
        if (!isPasswordValid) { return null; }
        await db.collection("Users").updateOne({ email }, { $set: { lastLoggedIn: new Date() } });
        return user
    }
    return null;
}

export const authOptions = NextAuth({
    providers: [
        CredentialsProvider({
            authorize
        })
    ],
    callbacks: {
        async jwt({ token, user }) {
            return { ...token, ...user };
        },
        async session({ session, token }) {
            session.user = token;
            return session;
        }
    },
    session: {
        strategy: "jwt",
    },
    pages: {
        signIn: '/login',
    },
    secret: process.env.SECRET,
    NEXTAUTH_URL: process.env.NEXTAUTH_URL
});

export { authOptions as GET, authOptions as POST };
Run Code Online (Sandbox Code Playgroud)

用户对象

{
  "_id": {
    "$oid": "615fb61796e77940b7f7a5e7"
  },
  "email": "test@test.com",
  "password": "$2b$12$fCADz/THWfE7.hThRiFj2eNJxTL78.7zPtyRtERxkBlU2hwlYRJ9K",
  "firstName": "John",
  "lastName": "Smith",
  "lastLoggedIn": {
    "$date": "2023-07-21T17:36:06.893Z"
  },
  "phoneNumber": "",
  "role": "Admin",
  "status": "Active",
  "company": "TestCompany",
  "jobTitle": "TestJobTitle",
  "department": "TestDepartment"
}
Run Code Online (Sandbox Code Playgroud)

API路线

import { getServerSession } from 'next-auth';
import { authOptions } from "@/app/api/auth/[...nextauth]/route"

export async function GET(request) {
    const session = await getServerSession(authOptions);
    console.log(session)
}
Run Code Online (Sandbox Code Playgroud)

客户端页面-控制台日志输出

user {
  "_id": "615fb61796e77940b7f7a5e7",
  "email": "test@test.com",
  "password": "$2b$12$fCADz/THWfE7.hThRiFj2eNJxTL78.7zPtyRtERxkBlU2hwlYRJ9K",
  "firstName": "John",
  "lastName": "Smith",
  "lastLoggedIn": "2023-07-21T17:36:06.893Z",
  "phoneNumber": "",
  "role": "Admin",
  "status": "Active",
  "company": "TestCompany",
  "jobTitle": "TestJobTitle",
  "department": "TestDepartment"
  "iat": 1689960966,
  "exp": 1692552966,
  "jti": "ae91e614-4fdb-4de4-9e5e-5b9879ca07ba"
}
Run Code Online (Sandbox Code Playgroud)

API路由-控制台日志输出

{
  user: { name: undefined, email: 'test@test.com', image: undefined }
}
Run Code Online (Sandbox Code Playgroud)

预期输出

用户会话数据的预期输出应与用户对象匹配。

{    
  user: {
      "_id": "615fb61796e77940b7f7a5e7",
      "email": "test@test.com",
      "password": "$2b$12$fCADz/THWfE7.hThRiFj2eNJxTL78.7zPtyRtERxkBlU2hwlYRJ9K",
      "firstName": "John",
      "lastName": "Smith",
      "lastLoggedIn": "2023-07-21T17:36:06.893Z",
      "phoneNumber": "",
      "role": "Admin",
      "status": "Active",
      "company": "TestCompany",
      "jobTitle": "TestJobTitle",
      "department": "TestDepartment"
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 0

我相信您可以简单地从 [...nextauth]/route.ts 导出 authOptions 对象,如下所示:

export const authOptions = {
   //...
};

const handler = NextAuth(authOptions);

export { handler as GET, handler as POST };
Run Code Online (Sandbox Code Playgroud)