You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

153 lines
3.7 KiB

import CredentialsProvider from 'next-auth/providers/credentials'
import { httpServerClient } from './httpServerClient'
import { DefaultSession } from 'next-auth'
import { ApiEndpoints } from '@/config/api'
import { Routes } from '@/config/routes'
// add custom fields to the session and user interfaces
declare module 'next-auth' {
interface Session {
user: {
avatar?: string
accessToken?: string
} & DefaultSession['user']
}
interface User {
avatar?: string
accessToken?: string
}
}
export const authOptions = {
providers: [
CredentialsProvider({
id: 'email-password-login',
name: 'email-password-login',
credentials: {
email: { label: 'email', type: 'text' },
password: { label: 'Password', type: 'password' },
},
async authorize(credentials) {
const { email, password } = credentials
try {
const res = await httpServerClient.post(ApiEndpoints.auth.login(), {
email,
password,
})
const user = res.data.data.user
const accessToken = res.data.data.accessToken
return {
...user,
accessToken,
}
} catch (e) {
console.log(e)
return null
}
},
}),
CredentialsProvider({
id: 'email-password-register',
name: 'email-password-register',
credentials: {
email: { label: 'email', type: 'text' },
password: { label: 'Password', type: 'password' },
name: { label: 'Name', type: 'text' },
phone: { label: 'Phone', type: 'text' },
},
async authorize(credentials) {
const { email, password, name, phone } = credentials
try {
const res = await httpServerClient.post(
ApiEndpoints.auth.register(),
{
email,
password,
name,
phone,
}
)
const user = res.data.data.user
const accessToken = res.data.data.accessToken
return {
...user,
accessToken,
}
} catch (e) {
console.log(e)
return null
}
},
}),
CredentialsProvider({
id: 'google-id-token-login',
name: 'google-id-token-login',
credentials: {
idToken: { label: 'idToken', type: 'text' },
},
async authorize(credentials) {
const { idToken } = credentials
try {
const res = await httpServerClient.post(
ApiEndpoints.auth.signInWithGoogle(),
{
idToken,
}
)
const user = res.data.data.user
const accessToken = res.data.data.accessToken
return {
...user,
accessToken,
}
} catch (e) {
console.log(e)
return null
}
},
}),
],
pages: {
signIn: Routes.login,
},
session: {
strategy: 'jwt',
},
callbacks: {
async jwt({ token, user, trigger, session }) {
if (trigger === 'update') {
if (session.name !== token.name) {
token.name = session.name
}
if (session.phone !== token.phone) {
token.phone = session.phone
}
return token
}
if (user) {
token.id = user._id
token.role = user.role
token.accessToken = user.accessToken
token.avatar = user.avatar
}
return token
},
async session({ session, token }): Promise<any> {
session.user.id = token.id
session.user.role = token.role
session.user.accessToken = token.accessToken
session.user.avatar = token.avatar
return session
},
},
}