I need to access user session data in a Next-Auth/Nextjs 13.4 API Route. I have configured the JWT and Session callback; however, the user data I specified in the callback function does not translate to what getServerSession is pulling in an API route. However, the session data does correctly reflect in a Client page when using useSession() so I'm not sure what the issue is.
[...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 };
User Object
{
"_id": {
"$oid": "615fb61796e77940b7f7a5e7"
},
"email": "[email protected]",
"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"
}
API Route
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)
}
Client Page - Console Log Output
user {
"_id": "615fb61796e77940b7f7a5e7",
"email": "[email protected]",
"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"
}
API Route - Console Log Output
{
user: { name: undefined, email: '[email protected]', image: undefined }
}
Expected Output
The expected output of the user session data should match the user object.
{
user: {
"_id": "615fb61796e77940b7f7a5e7",
"email": "[email protected]",
"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"
}
}