kgroad-frontend2/app/api/auth/[...nextauth]/route.ts
2024-02-02 17:35:09 +06:00

92 lines
2.0 KiB
TypeScript

import axios from "axios";
import NextAuth, { NextAuthOptions } from "next-auth";
import { JWT } from "next-auth/jwt";
import CredentialsProvider from "next-auth/providers/credentials";
interface IToken {
access: string;
}
const refreshToken = async (token: JWT): Promise<JWT> => {
const data = {
refresh: token.refresh_token,
};
const response = await axios.post<IToken>(
"https://api.kgroaduat.fishrungames.com/api/v1/token/refresh/",
data
);
return {
...token,
access_token: response.data.access,
};
};
export const authOptions: NextAuthOptions = {
providers: [
CredentialsProvider({
name: "Credentials",
credentials: {
email: {
label: "Email",
type: "text",
placeholder: "jsmith@example.com",
},
password: { label: "Password", type: "password" },
},
async authorize(credentials, req) {
if (!credentials?.email || !credentials?.password)
return null;
const { email, password } = credentials as any;
const res = await fetch(
"https://api.kgroaduat.fishrungames.com/api/v1/users/login/",
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
email,
password,
}),
}
);
if (res.status === 401) {
console.log(res.status);
return null;
}
const user = await res.json();
return user;
},
}),
],
pages: {
signIn: "/sign-in",
},
session: {
strategy: "jwt",
},
callbacks: {
async jwt({ token, user }) {
if (user) return { ...token, ...user };
return refreshToken(token);
},
async session({ token, session }) {
session.access_token = token.access_token;
session.refresh_token = token.refresh_token;
return session;
},
},
};
const handler = NextAuth(authOptions);
export { handler as GET, handler as POST };