forked from Transparency/kgroad-frontend2
92 lines
2.0 KiB
TypeScript
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 };
|