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)