Repository navigation
Expand file tree
/
Copy pathauth.ts
More file actions
88 lines (79 loc) · 2.45 KB
/
Copy pathauth.ts
File metadata and controls
88 lines (79 loc) · 2.45 KB
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
import NextAuth, { User } from 'next-auth';
import Credentials from 'next-auth/providers/credentials';
import { reissueToken, signIn as signInFromBackend } from './apis/authApi';
import { ACCESS_TOKEN_EXPIRES } from './constants/token';
import { JWT } from 'next-auth/jwt';
const refreshAccessToken = async (token: JWT): Promise<JWT> => {
const { accessToken, refreshToken } = await reissueToken(token.refreshToken!);
if (accessToken && refreshToken) {
return {
...token,
accessToken,
refreshToken,
expires_at: Date.now() + ACCESS_TOKEN_EXPIRES,
};
}
return {
...token,
error: 'RefreshAccessTokenError' as const,
};
};
export const { handlers, signIn, signOut, auth } = NextAuth({
trustHost: true,
providers: [
Credentials({
credentials: {
email: { label: '이메일', type: 'text', placeholder: '이메일을 입력해주세요.' },
password: { label: '비밀번호', type: 'password', placeholder: '비밀번호를 입력해주세요.' },
},
async authorize(credentials): Promise<User | null> {
if (!credentials?.email || !credentials?.password) return null;
try {
const response = await signInFromBackend({
email: credentials.email as string,
password: credentials.password as string,
});
const { accessToken, refreshToken } = response;
return {
id: credentials.email as string,
email: credentials.email as string,
accessToken,
refreshToken,
};
} catch (error) {
console.error('Auth error:', error);
return null;
}
},
}),
],
callbacks: {
async jwt({ token, user, account }): Promise<JWT | null> {
if (account && user) {
return {
...token,
accessToken: user.accessToken,
refreshToken: user.refreshToken,
expires_at: Date.now() + ACCESS_TOKEN_EXPIRES,
user,
};
}
if (Date.now() < token.expires_at!) {
return token;
}
return await refreshAccessToken(token);
},
async session({ session, token }) {
if (token) {
session.user.accessToken = token.accessToken;
session.user.refreshToken = token.refreshToken;
session.user.expires_at = token.expires_at;
session.error = token.error;
}
return session;
},
},
pages: {
signIn: '/login',
},
});