返回 presentation-ai
auth.ts
根目录 / src / server / auth.ts
1 import { env } from "@/env";
2 import { db } from "@/server/db";
3 import { PrismaAdapter } from "@auth/prisma-adapter";
4 import NextAuth, { type DefaultSession, type Session } from "next-auth";
5 import { type Adapter } from "next-auth/adapters";
6 import GoogleProvider from "next-auth/providers/google";
7 declare module "next-auth" {
8 interface Session extends DefaultSession {
9 user: {
10 id: string;
11 hasAccess: boolean;
12 location?: string;
13 role: string;
14 isAdmin: boolean;
15 } & DefaultSession["user"];
16 }
17
18 interface User {
19 hasAccess: boolean;
20 role: string;
21 }
22 }
23
24 export const { auth, handlers, signIn, signOut } = NextAuth({
25 trustHost: true,
26 session: {
27 strategy: "jwt",
28 },
29 callbacks: {
30 async jwt({ token, user, trigger, session }) {
31 if (user) {
32 token.id = user.id;
33 token.hasAccess = user.hasAccess;
34 token.name = user.name;
35 token.image = user.image;
36 token.picture = user.image;
37 token.location = (user as Session["user"]).location;
38 token.role = user.role;
39 token.isAdmin = user.role === "ADMIN";
40 }
41
42 // Handle updates
43 if (trigger === "update" && (session as Session)?.user) {
44 const user = await db.user.findUnique({
45 where: { id: token.id as string },
46 });
47 console.log("Session", session, user);
48 if (session) {
49 token.name = (session as Session).user.name;
50 token.image = (session as Session).user.image;
51 token.picture = (session as Session).user.image;
52 token.location = (session as Session).user.location;
53 token.role = (session as Session).user.role;
54 token.isAdmin = (session as Session).user.role === "ADMIN";
55 }
56 if (user) {
57 token.hasAccess = user?.hasAccess ?? false;
58 token.role = user.role;
59 token.isAdmin = user.role === "ADMIN";
60 }
61 }
62
63 return token;
64 },
65 async session({ session, token }) {
66 session.user.id = token.id as string;
67 session.user.hasAccess = token.hasAccess as boolean;
68 session.user.location = token.location as string;
69 session.user.role = token.role as string;
70 session.user.isAdmin = token.role === "ADMIN";
71 return session;
72 },
73 async signIn({ user, account }) {
74 if (account?.provider === "google") {
75 const dbUser = await db.user.findUnique({
76 where: { email: user.email! },
77 select: { id: true, hasAccess: true, role: true },
78 });
79
80 if (dbUser) {
81 user.hasAccess = dbUser.hasAccess;
82 user.role = dbUser.role;
83 } else {
84 user.hasAccess = false;
85 user.role = "USER";
86 }
87 }
88
89 return true;
90 },
91 },
92
93 adapter: PrismaAdapter(db) as Adapter,
94 providers: [
95 GoogleProvider({
96 clientId: env.GOOGLE_CLIENT_ID,
97 clientSecret: env.GOOGLE_CLIENT_SECRET,
98 }),
99 ],
100 });
101
101 lines TYPESCRIPT