step 1 ? nn en vrai j'y crois pas

This commit is contained in:
Guillem George 2026-05-15 18:31:16 +02:00
parent 168a35f9de
commit 414aec97e5
3 changed files with 175 additions and 124 deletions

View file

@ -1,20 +1,20 @@
import * as auth from "../../../utils/auth" import * as auth from "../../../utils/auth";
let code; let code;
try { try {
const params = new URLSearchParams(window.location.search) const params = new URLSearchParams(window.location.search);
code = params.get("code")
} code = params.get("code");
catch { } catch {
console.error("Unable to retrieve code") console.error("Unable to retrieve code");
alert("Unable to retrieve code") alert("Unable to retrieve code");
} }
if (! await auth.getToken(code)) { if (!(await auth.getToken(code))) {
console.error("Unable to retrieve token") console.error("Unable to retrieve token");
alert("Unable to retrieve token") alert("Unable to retrieve token");
} }
console.debug("Redirecting...") console.debug("Redirecting...");
window.location = import.meta.env.VITE_URL window.location = import.meta.env.VITE_URL;

View file

@ -1,123 +1,176 @@
import * as redirect from "./redirect"; import * as redirect from "./redirect";
async function sendRequest(endpoint, body) { async function sendRequest(endpoint, body) {
const request = { const formData = new FormData();
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
body: new URLSearchParams(body) for (var key in body) {
}; formData.append(key, body[key]);
console.debug(request)
let response;
try {
response = await fetch(endpoint, request)
if (!response.ok) {
throw new Error(response.statusText)
} }
}
catch (err) { const request = {
console.error(err) method: "POST",
return null headers: {
} "Content-Type": "application/x-www-form-urlencoded",
},
return await response.json()
body: formData,
};
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 * @param {string} code the authorization code received from the OIDC
* provider * provider
* @returns {boolean} true if the token was fetched, false otherwise * @returns {Promise<boolean>} true if the token was fetched, false otherwise
*/ */
async function getToken(code) { 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);
const auth_url = import.meta.env.VITE_URL; if (response === null) {
const endpoint = `${auth_url}/auth-api/token`; console.error("Failed to retrieve OIDC token");
const formData = { alert("Failed to retrieve OIDC token");
"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(); localStorage.clear();
redirect.redirectToLoginPage() redirect.redirectToLoginPage();
return false; return false;
} }
localStorage.setItem("token", response.id_token); localStorage.setItem("token", response.id_token);
localStorage.setItem("refresh_token", response.refresh_token); localStorage.setItem("refresh_token", response.refresh_token);
console.debug("Saved token and refresh tokens") console.debug("Saved token and refresh tokens");
return true return true;
} }
/** /**
* @param {string} refreshToken the refresh token (optional) * @param {string} refreshToken the refresh token (optional)
* @returns {boolean} whether the token has been refreshed or not * @returns {Promise<boolean>} whether the token has been refreshed or not
*/ */
async function refreshToken(refreshToken) { async function refreshToken(refreshToken) {
refreshToken = refreshToken || localStorage.getItem("refresh_token");
if (!refreshToken) {
console.error("Unable to retrieve refresh token");
return false;
}
refreshToken= refreshToken || localStorage.getItem("refresh_token"); const auth_url = import.meta.env.VITE_URL;
if (!refreshToken) { const endpoint = `${auth_url}/auth-api/token`;
console.error("Unable to retrieve refresh token") const formData = {
return false client_id: import.meta.env.VITE_CLIENT_ID,
} // client_secret: "",
grant_type: "authorization_code",
const auth_url = import.meta.env.VITE_URL; refresh_token: refreshToken,
const endpoint = `${auth_url}/auth-api/token`; scope: "epita profile picture",
const formData = { };
"client_id": import.meta.env.VITE_CLIENT_ID, const response = await sendRequest(endpoint, formData);
// 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(); if (response === null) {
redirect.redirectToLoginPage() console.error("Failed to retrieve OIDC token");
return false; alert("Failed to retrieve OIDC token");
}
localStorage.setItem("token", response.id_token); localStorage.clear();
localStorage.setItem("refresh_token", response.refresh_token); redirect.redirectToLoginPage();
console.debug("Saved token and refresh tokens") return false;
}
return true 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 * @returns {Promise<boolean>} true if the user is authenticated, false otherwise
*/ */
async function authenticate() { async function authenticate() {
const token = localStorage.getItem("token"); 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(); if (token !== null) {
return false; return true;
}
const refresh_token = localStorage.getItem("refresh_token");
if (refresh_token !== null) {
return true;
}
localStorage.clear();
redirect.redirectToLoginPage();
return false;
} }
// FIXME /**
// missing functions: * @param {string} endpoint
// - authedAPIRequest (makes an authenticated request to the API) * @param {object} options this object should at least contain the method.
* @returns {Promise<Response>} the response or null
* We want a {Promise<Response>} so we can read the headers as well as the
* body, rather than just the body
*/
async function authedAPIRequest(endpoint, options) {
console.log("Attemtping to make a request to: " + endpoint); // TODO remove
if (!authenticate()) {
return null;
}
export { if (!options.method) {
getToken, console.error("Invalid parameter: options (missing method)");
refreshToken, }
authenticate
if (!options.headers) {
options.headers = {};
}
options.headers.Authorization = localStorage.getItem("token");
options.mode = "cors";
let response;
try {
response = await fetch(endpoint, options);
if (!response.ok) {
throw new Error(response.statusText);
}
} catch (err) {
if (response.status === 401) {
const response_err = await response.text();
if (response_err.includes("Token expired")) {
refreshToken(null);
return null;
}
localStorage.clear();
redirect.redirectToLoginPage();
return null;
}
console.error(err);
}
return response;
} }
export { getToken, refreshToken, authenticate, authedAPIRequest };

View file

@ -1,29 +1,27 @@
/** /**
* @returns {URL} the URL to redirect the user to the login page. * @returns {URL} the URL to redirect the user to the login page.
*/ */
function createLink() { function createLink() {
const params = new URLSearchParams({ const params = new URLSearchParams({
client_id: import.meta.env.VITE_CLIENT_ID, client_id: import.meta.env.VITE_CLIENT_ID,
response_type: "code", response_type: "code",
redirect_uri: import.meta.env.VITE_URL + "/complete/epita/", redirect_uri: import.meta.env.VITE_URL + "/complete/epita/",
scope: "epita profile picture" scope: "epita profile picture",
}); });
const base_url = import.meta.env.VITE_AUTH_URL const base_url = import.meta.env.VITE_AUTH_URL;
const res = `${base_url}/authorize?${params}` const res = `${base_url}/authorize?${params}`;
return res;
return new URL(res);
} }
/** /**
* @returns {void} * @returns {void}
*/ */
function redirectToLoginPage() { function redirectToLoginPage() {
const redirectUrl = createLink(); const redirectUrl = createLink();
window.location.href = redirectUrl;
window.location.href = redirectUrl;
} }
export { export { createLink, redirectToLoginPage };
createLink,
redirectToLoginPage
}