-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathauth.ts
125 lines (104 loc) · 3.61 KB
/
auth.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import CredentialsProvider from 'next-auth/providers/credentials';
import GoogleProvider from 'next-auth/providers/google'
import prisma from './singletonDb';
import { redirect } from 'next/navigation'
import { Session } from 'inspector/promises';
import {JWTPayload, SignJWT, importJWK } from 'jose'
import { JWT } from "next-auth/jwt";
import { DefaultSession } from 'next-auth';
export interface session extends DefaultSession{
user: {
id: string;
jwtToken: string;
email: string;
name: string;
};
}
interface User {
id: string;
name: string;
email: string;
token: string;
}
export const NEXT_AUTH = {
providers:[
CredentialsProvider({
name:"Email",
credentials:{
name:{label:"Name", type:"text", placeholder:"john doe"},
username:{label:"Email", type:"text", placeholder:"[email protected]" },
password:{label:"Password", type:"password", placeholder:"password"}
},
async authorize(credentials:any){
const response = await prisma.user.findFirst({
where:{
email:credentials.username,
password:credentials.password
}
})
if(response){
const jwt = generateToken({
id:response.id
});
return {
id:response.id,
name:response.name,
email:credentials.username,
token:jwt
}
}
try{
const user= await prisma.user.create({
data:{
email:credentials.username,
password:credentials.password,
name:credentials.name
}
})
const jwt = generateToken({id:user.id});
return {
id:user.id,
name:credentials.name,
email:credentials.username,
token:jwt
}
}catch(error){
return null
}
}
}),
GoogleProvider({
clientId: process.env.GOOGLE_CLIENT_ID || "",
clientSecret: process.env.GOOGLE_CLIENT_SECRET || ""
})
],
secret:process.env.NEXTAUTH_SECRET,
callbacks:{
session: ({session, token, user}:any)=>{
const newSession: session = session as session
if(newSession.user && token.uid){
newSession.user.id = token.uid as string;
newSession.user.jwtToken = token.jwtToken as string;
}
return newSession
},
jwt:({token , user}:any)=>{
const newToken = token;
if (user) {
newToken.uid = user.id;
newToken.jwtToken = (user as User).token;
}
return newToken;
}
}
}
async function generateToken(payload:JWTPayload){
const secret = process.env.JWT_SECRET || "secret";
const jwk = await importJWK({k:secret , alg:"HS256", kty:"oct"});
const jwt = await new SignJWT(payload)
.setProtectedHeader({alg:"HS256"})
.setIssuedAt()
.setExpirationTime("365d")
.sign(jwk)
return jwt
}