forked from Transparency/kgroad-frontend2
151 lines
3.7 KiB
TypeScript
151 lines
3.7 KiB
TypeScript
import axios from "axios";
|
|
import { AuthOptions } from "next-auth";
|
|
import { JWT } from "next-auth/jwt";
|
|
import CredentialsProvider from "next-auth/providers/credentials";
|
|
import { apiInstance } from "./apiConfig";
|
|
import { IRefresh, ITokens } from "../types/token-type";
|
|
import GoogleProvider from "next-auth/providers/google";
|
|
|
|
const refreshToken = async (token: JWT): Promise<JWT> => {
|
|
const UTC = new Date();
|
|
|
|
const data = {
|
|
refresh: token.refresh_token,
|
|
};
|
|
|
|
const response = await apiInstance.post<IRefresh>(
|
|
"/users/refresh/",
|
|
data
|
|
);
|
|
|
|
const expirationTime = new Date(UTC.getTime() + 14 * 60000);
|
|
expirationTime.setTime(
|
|
expirationTime.getTime() +
|
|
expirationTime.getTimezoneOffset() * 60 * 1000 * -1
|
|
);
|
|
|
|
return {
|
|
...token,
|
|
access_token: response.data.access,
|
|
expires_in: expirationTime,
|
|
};
|
|
};
|
|
|
|
export const authConfig: AuthOptions = {
|
|
providers: [
|
|
CredentialsProvider({
|
|
name: "Credentials",
|
|
credentials: {
|
|
email: {
|
|
label: "Email",
|
|
type: "text",
|
|
placeholder: "jsmith@example.com",
|
|
},
|
|
password: { label: "Password", type: "password" },
|
|
},
|
|
async authorize(credentials, req): Promise<any> {
|
|
if (!credentials?.email || !credentials?.password)
|
|
return null;
|
|
|
|
const { email, password } = credentials;
|
|
const data = {
|
|
email,
|
|
password,
|
|
};
|
|
|
|
const res = await apiInstance.post<ITokens>(
|
|
"/users/login/",
|
|
data
|
|
);
|
|
|
|
if ([200, 201].includes(res.status)) {
|
|
const currentTime = new Date();
|
|
const expirationTime = new Date(
|
|
currentTime.getTime() + 14 * 60000
|
|
);
|
|
expirationTime.setTime(
|
|
expirationTime.getTime() +
|
|
expirationTime.getTimezoneOffset() * 60 * 1000 * -1
|
|
);
|
|
|
|
const user = {
|
|
refresh_token: res.data.refresh_token,
|
|
access_token: res.data.access_token,
|
|
expires_in: expirationTime,
|
|
};
|
|
|
|
return user;
|
|
}
|
|
|
|
return null;
|
|
},
|
|
}),
|
|
GoogleProvider({
|
|
clientId: process.env.CLIENT_ID as string,
|
|
clientSecret: process.env.CLIENT_SECRET as string,
|
|
}),
|
|
],
|
|
pages: {
|
|
signIn: "/sign-in",
|
|
},
|
|
session: {
|
|
strategy: "jwt",
|
|
},
|
|
callbacks: {
|
|
async signIn({ account, user }) {
|
|
if (account?.provider === "google") {
|
|
const data = {
|
|
auth_token: account?.id_token,
|
|
};
|
|
|
|
const res = await apiInstance.post<ITokens>(
|
|
"/users/google/",
|
|
data
|
|
);
|
|
|
|
if (![200, 201].includes(res.status)) {
|
|
return false;
|
|
}
|
|
|
|
const currentTime = new Date();
|
|
|
|
const expirationTime = new Date(
|
|
currentTime.getTime() + 15 * 60000
|
|
);
|
|
|
|
user.access_token = res.data.access_token;
|
|
user.refresh_token = res.data.refresh_token;
|
|
user.expires_in = expirationTime;
|
|
}
|
|
|
|
return true;
|
|
},
|
|
async jwt({ token, user }) {
|
|
if (user) return { ...token, ...user };
|
|
|
|
const UTC = new Date();
|
|
const currentTime = new Date(UTC.getTime());
|
|
currentTime.setTime(
|
|
currentTime.getTime() +
|
|
currentTime.getTimezoneOffset() * 60 * 1000 * -1
|
|
);
|
|
|
|
const isValid =
|
|
new Date(currentTime).getTime() <=
|
|
new Date(token.expires_in).getTime();
|
|
|
|
if (isValid) return token;
|
|
|
|
return await refreshToken(token);
|
|
},
|
|
|
|
async session({ token, session }) {
|
|
session.access_token = token.access_token;
|
|
session.refresh_token = token.refresh_token;
|
|
session.expires_in = token.expires_in;
|
|
|
|
return session;
|
|
},
|
|
},
|
|
};
|