diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts index b6d9d6f..d5d266e 100644 --- a/pages/api/auth/[...nextauth].ts +++ b/pages/api/auth/[...nextauth].ts @@ -1,3 +1,4 @@ +import { NextApiRequest, NextApiResponse } from "next"; import NextAuth, { TokenSet } from "next-auth"; import { JWT } from "next-auth/jwt"; import SpotifyProvider from "next-auth/providers/spotify"; @@ -51,110 +52,117 @@ async function getDeezerToken(paramsUrl: URLSearchParams): Promise { }; } -export default NextAuth({ - providers: [ - SpotifyProvider({ - clientId: process.env.SPOTIFY_CLIENT_ID, - clientSecret: process.env.SPOTIFY_CLIENT_SECRET, - authorization: `https://accounts.spotify.com/authorize?scope=user-top-read,user-read-private`, - }), - { - id: "deezer", - name: "Deezer", - type: "oauth", - clientId: process.env.DEEZER_CLIENT_ID, - clientSecret: process.env.DEEZER_CLIENT_SECRET, - token: { - async request({ provider, params }) { - if (provider.clientId === undefined || provider.clientSecret === undefined || params.code === undefined) { - throw new Error("Provider is not defined"); - } - const paramsUrl = new URLSearchParams({ - app_id: provider.clientId, - secret: provider.clientSecret, - code: params.code, - }); - const tokens = await getDeezerToken(paramsUrl); - return { tokens }; +export default function auth(req: NextApiRequest, res: NextApiResponse): ReturnType { + req.headers["x-forwarded-host"] = process.env.NEXTAUTH_URL; + return NextAuth(req, res, { + providers: [ + SpotifyProvider({ + clientId: process.env.SPOTIFY_CLIENT_ID, + clientSecret: process.env.SPOTIFY_CLIENT_SECRET, + authorization: `https://accounts.spotify.com/authorize?scope=user-top-read,user-read-private`, + }), + { + id: "deezer", + name: "Deezer", + type: "oauth", + clientId: process.env.DEEZER_CLIENT_ID, + clientSecret: process.env.DEEZER_CLIENT_SECRET, + token: { + async request({ provider, params }) { + if (provider.clientId === undefined || provider.clientSecret === undefined || params.code === undefined) { + throw new Error("Provider is not defined"); + } + const paramsUrl = new URLSearchParams({ + app_id: provider.clientId, + secret: provider.clientSecret, + code: params.code, + }); + const tokens = await getDeezerToken(paramsUrl); + return { tokens }; + }, }, - }, - authorization: { - url: "https://connect.deezer.com/oauth/auth.php", - params: { - redirect_uri: "https://statlist.fr/api/auth/callback/deezer", - scope: "basic_access,email,listening_history,offline_access", + authorization: { + url: "https://connect.deezer.com/oauth/auth.php", + params: { + redirect_uri: "https://statlist.fr/api/auth/callback/deezer", + scope: "basic_access,email,listening_history,offline_access", + }, }, - }, - userinfo: { - url: "https://api.deezer.com/user/me", - async request({ tokens, client }) { - const { access_token } = tokens; - if (typeof access_token === "undefined") { - throw new Error("Users Acces Token is Undefined!"); - } - return await client.userinfo(access_token, { params: { access_token } }); + userinfo: { + url: "https://api.deezer.com/user/me", + async request({ tokens, client }) { + const { access_token } = tokens; + if (typeof access_token === "undefined") { + throw new Error("Users Acces Token is Undefined!"); + } + return await client.userinfo(access_token, { params: { access_token } }); + }, + }, + async profile(user: User) { + return { + id: user.id, + name: user.name, + email: user.email, + image: user.picture, + }; }, }, - async profile(user: User) { - return { - id: user.id, - name: user.name, - email: user.email, - image: user.picture, - }; - }, + ], + secret: process.env.NEXTAUTH_SECRET, + pages: { + signIn: "/login", }, - ], - secret: process.env.NEXTAUTH_SECRET, - pages: { - signIn: "/login", - }, - callbacks: { - async jwt({ token, account, user }) { - if (account != null && account.provider === "spotify" && user != null && typeof account.expires_at === "number") { - return { - ...token, - accessToken: account.access_token, - accessTokenExpires: account.expires_at * 1000, - refreshToken: account.refresh_token, - username: account.providerAccountId, - provider: account.provider, - user, - }; - } - if (account != null && account.provider === "deezer" && typeof account.expires_at === "number") { - return { - ...token, - accessToken: account.access_token, - accessTokenExpires: account.expires_at, - refreshToken: account.refresh_token, - username: account.providerAccountId, - provider: account.provider, - user, - }; - } - if ( - token.provider === "spotify" && - token.accessTokenExpires !== undefined && - Date.now() < token.accessTokenExpires - ) { - return token; - } - if (token.provider === "spotify") { - return await spotifyRefreshAccessToken(token); - } - return { ...token }; + callbacks: { + async jwt({ token, account, user }) { + if ( + account != null && + account.provider === "spotify" && + user != null && + typeof account.expires_at === "number" + ) { + return { + ...token, + accessToken: account.access_token, + accessTokenExpires: account.expires_at * 1000, + refreshToken: account.refresh_token, + username: account.providerAccountId, + provider: account.provider, + user, + }; + } + if (account != null && account.provider === "deezer" && typeof account.expires_at === "number") { + return { + ...token, + accessToken: account.access_token, + accessTokenExpires: account.expires_at, + refreshToken: account.refresh_token, + username: account.providerAccountId, + provider: account.provider, + user, + }; + } + if ( + token.provider === "spotify" && + token.accessTokenExpires !== undefined && + Date.now() < token.accessTokenExpires + ) { + return token; + } + if (token.provider === "spotify") { + return await spotifyRefreshAccessToken(token); + } + return { ...token }; + }, + async session({ session, token }) { + session.user.accessToken = token.accessToken; + session.user.refreshToken = token.refreshToken; + session.user.username = token.username; + session.user.provider = token.provider; + return session; + }, }, - async session({ session, token }) { - session.user.accessToken = token.accessToken; - session.user.refreshToken = token.refreshToken; - session.user.username = token.username; - session.user.provider = token.provider; - return session; + session: { + strategy: "jwt", }, - }, - - session: { - strategy: "jwt", - }, -}); + }); +} diff --git a/pages/login.tsx b/pages/login.tsx index 9a01fe1..99a37a5 100644 --- a/pages/login.tsx +++ b/pages/login.tsx @@ -8,7 +8,7 @@ import style from "@styles/Pages/login.module.scss"; const Login: FC> = ({ providers }) => { async function logIn(provider: ClientSafeProvider["id"]): Promise { - await signIn(provider, { callbackUrl: `https://statlist.fr/${provider}` }); + await signIn(provider, { callbackUrl: `/${provider}` }); } return ( <>