metrics/utils/auth.js

85 lines
2.0 KiB
JavaScript

import axios from "axios";
export async function login() {
return (window.location.href = `https://github.com/login/oauth/authorize?client_id=${process.env.NEXT_PUBLIC_GITHUB_CLIENT_ID}&scope=repo read:org read:project`);
}
export async function isLoggedIn() {
if (
!localStorage.getItem("access_token") ||
!localStorage.getItem("token_expiration") ||
localStorage.getItem("access_token") === "undefined"
) {
return false;
}
if (
localStorage.getItem("token_expiration") < Math.floor(Date.now() / 1000)
) {
if (
!localStorage.getItem("refresh_token") ||
localStorage.getItem("refresh_token_expiration") <
Math.floor(Date.now() / 1000)
) {
return false;
} else {
await refreshToken();
}
}
return true;
}
export async function logout() {
localStorage.clear();
window.location.href = "/";
}
export async function getToken(code) {
const data = (await axios.get(`/api/verify?code=${code}`)).data;
if (!data.access_token) {
await logout();
return false;
}
localStorage.setItem("access_token", data.access_token);
localStorage.setItem("refresh_token", data.refresh_token);
localStorage.setItem(
"token_expiration",
Math.floor(Date.now() / 1000) + data.expires_in - 5
);
localStorage.setItem(
"refresh_token_expiration",
Math.floor(Date.now() / 1000) + data.refresh_token_expires_in - 5
);
}
export async function refreshToken() {
const token = localStorage.getItem("refresh_token");
if (!token) {
await logout();
return false;
}
const data = (await axios.get(`/api/refresh?token=${token}`)).data;
if (!data.access_token) {
await logout();
return false;
}
localStorage.setItem("access_token", data.access_token);
localStorage.setItem("refresh_token", data.refresh_token);
localStorage.setItem(
"token_expiration",
Math.floor(Date.now() / 1000) + data.expires_in - 5
);
localStorage.setItem(
"refresh_token_expiration",
Math.floor(Date.now() / 1000) + data.refresh_token_expires_in - 5
);
}