Guest User

auth.ts

a guest
Mar 29th, 2024
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 1.76 KB | Source Code | 0 0
  1. import authConfig from "@/auth.config"
  2. import { PrismaAdapter } from "@auth/prisma-adapter"
  3. import { UserRole } from "@prisma/client"
  4. import NextAuth from "next-auth"
  5.  
  6. import { getUserById } from "@/lib/api/services/user"
  7. import db from "@/lib/db"
  8.  
  9. export const {
  10.   handlers: { GET, POST },
  11.   auth,
  12.   signIn,
  13.   signOut,
  14.   unstable_update,
  15. } = NextAuth({
  16.   pages: {
  17.     signIn: "/login",
  18.   },
  19.   events: {
  20.     async linkAccount({ user }) {
  21.       await db.user.update({
  22.         where: { id: user.id },
  23.         data: { emailVerified: new Date() },
  24.       })
  25.     },
  26.   },
  27.   callbacks: {
  28.     async signIn({ user, account }) {
  29.       // Allow OAuth without email verification
  30.       if (account?.provider !== "credentials") return true
  31.  
  32.       if (!user.id) return false
  33.  
  34.       const existingUser = await getUserById(user.id)
  35.  
  36.       // Prevent sign in without email verification
  37.       if (!existingUser?.emailVerified) return false
  38.  
  39.       return true
  40.     },
  41.     async session({ token, session }) {
  42.       if (token.sub && session.user) {
  43.         session.user.id = token.sub
  44.       }
  45.  
  46.       if (token.role && session.user) {
  47.         session.user.role = token.role as UserRole
  48.       }
  49.  
  50.       if (session.user) {
  51.         session.user.name = token.name
  52.         if (token.email) session.user.email = token.email
  53.       }
  54.  
  55.       return session
  56.     },
  57.     async jwt({ token }) {
  58.       if (!token.sub) return token
  59.  
  60.       const existingUser = await getUserById(token.sub)
  61.  
  62.       if (!existingUser) return token
  63.  
  64.       token.name = existingUser.name
  65.       token.email = existingUser.email
  66.       token.role = existingUser.role
  67.  
  68.       return token
  69.     },
  70.   },
  71.   adapter: PrismaAdapter(db),
  72.   session: {
  73.     strategy: "jwt",
  74.   },
  75.   ...authConfig,
  76. })
  77.  
Add Comment
Please, Sign In to add comment