import * as redirect from "./redirect"; async function sendRequest(endpoint, body) { const request = { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", }, body: new URLSearchParams(body) }; console.debug(request) let response; try { response = await fetch(endpoint, request) if (!response.ok) { throw new Error(response.statusText) } } catch (err) { console.error(err) return null } return await response.json() } /** * @param {string} code the authorization code received from the OIDC * provider * @returns {boolean} true if the token was fetched, false otherwise */ async function getToken(code) { const auth_url = import.meta.env.VITE_URL; const endpoint = `${auth_url}/auth-api/token`; const formData = { "grant_type": "authorization_code", "code": code, "redirect_uri": `${auth_url}/complete/epita/`, "client_id": import.meta.env.VITE_CLIENT_ID } const response = await sendRequest(endpoint, formData) if (response === null) { console.error("Failed to retrieve OIDC token") alert("Failed to retrieve OIDC token") localStorage.clear(); redirect.redirectToLoginPage() return false; } localStorage.setItem("token", response.id_token); localStorage.setItem("refresh_token", response.refresh_token); console.debug("Saved token and refresh tokens") return true } /** * @param {string} refreshToken the refresh token (optional) * @returns {boolean} whether the token has been refreshed or not */ async function refreshToken(refreshToken) { refreshToken= refreshToken || localStorage.getItem("refresh_token"); if (!refreshToken) { console.error("Unable to retrieve refresh token") return false } const auth_url = import.meta.env.VITE_URL; const endpoint = `${auth_url}/auth-api/token`; const formData = { "client_id": import.meta.env.VITE_CLIENT_ID, // client_secret: "", "grant_type": "authorization_code", refresh_token: refreshToken, scope: "epita profile picture" } const response = await sendRequest(endpoint, formData) if (response === null) { console.error("Failed to retrieve OIDC token") alert("Failed to retrieve OIDC token") localStorage.clear(); redirect.redirectToLoginPage() return false; } localStorage.setItem("token", response.id_token); localStorage.setItem("refresh_token", response.refresh_token); console.debug("Saved token and refresh tokens") return true } /** * @returns {boolean} true if the user is authenticated, false otherwise */ async function authenticate() { const token = localStorage.getItem("token"); if (token !== null) return true; const refresh_token = localStorage.getItem("refresh_token"); if (refresh_token !== null) return true; redirect.redirectToLoginPage(); return false; } // FIXME // missing functions: // - authedAPIRequest (makes an authenticated request to the API) export { getToken, refreshToken, authenticate }