import NextAuth from 'next-auth' import CredentialsProvider from 'next-auth/providers/credentials' import axios from 'axios' const options = { providers: [ CredentialsProvider({ name: 'Credentials', credentials: { username: {label: 'Email', type: 'email', placeholder: 'email@exemple.net'}, password: {label: 'Password', type: 'password'} }, authorize: async credentials => { try { const user = await axios.post(`${process.env.NEXT_PUBLIC_API_URL}/auth/local`, { identifier: credentials.username, password: credentials.password }) if (user.data) { return user.data } return null } catch (error) { const errorMessage = error.response.data.error.message throw new Error(errorMessage) } } }) ], secret: process.env.NEXT_PUBLIC_JWT_SECRET, session: { strategy: 'jwt' }, callbacks: { async jwt({token, user, account}) { if (user) { const response = await fetch( `${process.env.NEXT_PUBLIC_API_URL}/auth/${account.provider}/callback?access_token=${account?.accessToken}` ) const data = await response.json() token.id = data.id || user.id token.jwt = data.jwt || user.jwt token.user = data.user || user.user } return Promise.resolve(token) }, async session({session, token}) { session.jwt = token.jwt session.user = token.user return Promise.resolve(session) } }, pages: { signIn: '/soumet', error: '/soumet' } } const Auth = (request, response) => NextAuth(request, response, options) export default Auth