Configure session-aware authentication
A recovery system only feels trustworthy when it is anchored in the same identity model as the rest of the product. NextAuth gives you a clean way to authenticate users, enrich tokens, and keep role information available across the app.
NextAuth configuration
import User from '@/models/User';
import db from '@/utils/db';
import NextAuth from 'next-auth';
import CredentialsProvider from 'next-auth/providers/credentials';
import bcrypt from 'bcryptjs';
export default NextAuth({
session: {
strategy: 'jwt',
},
callbacks: {
async jwt({ token, user }) {
if (user?._id) token._id = user._id;
if (user?.isAdmin) token.isAdmin = user.isAdmin;
return token;
},
async session({ session, token }) {
if (token?._id) session.user._id = token._id;
if (token?.isAdmin) session.user.isAdmin = token.isAdmin;
return session;
},
},
providers: [
CredentialsProvider({
async authorize(credentials) {
await db.connect();
const user = await User.findOne({ email: credentials?.email });
await db.disconnect();
if (user && bcrypt.compareSync(credentials!.password, user.password)) {
return {
_id: user._id,
name: user.name,
email: user.email,
isAdmin: user.isAdmin,
};
}
throw new Error('Invalid email or password');
},
}),
],
});