Files
2026-07-23 13:38:20 +02:00

106 lines
2.2 KiB
JavaScript

import {
InteractionRequiredAuthError,
PublicClientApplication,
} from "@azure/msal-browser";
let msalInstance = null;
let apiScope = "";
function requireInstance() {
if (!msalInstance) {
throw new Error("MSAL n'est pas initialise.");
}
return msalInstance;
}
function activeAccount() {
const instance = requireInstance();
return instance.getActiveAccount() ?? instance.getAllAccounts()[0] ?? null;
}
async function initialize(tenantId, clientId, scope, redirectUri) {
if (msalInstance) {
return;
}
if (!tenantId || !clientId || !scope || !redirectUri) {
throw new Error("La configuration Azure du frontend est incomplete.");
}
apiScope = scope;
msalInstance = await PublicClientApplication.createPublicClientApplication({
auth: {
clientId,
authority: `https://login.microsoftonline.com/${tenantId}`,
redirectUri,
postLogoutRedirectUri: redirectUri,
},
cache: {
cacheLocation: "sessionStorage",
},
});
const account = activeAccount();
if (account) {
msalInstance.setActiveAccount(account);
}
}
async function signIn() {
const instance = requireInstance();
const result = await instance.loginPopup({
scopes: ["openid", "profile", "email", apiScope],
});
instance.setActiveAccount(result.account);
}
async function getAccessToken() {
const instance = requireInstance();
const account = activeAccount();
if (!account) {
throw new Error("Aucun compte Microsoft connecte.");
}
try {
const result = await instance.acquireTokenSilent({
account,
scopes: [apiScope],
});
return result.accessToken;
} catch (error) {
if (!(error instanceof InteractionRequiredAuthError)) {
throw error;
}
const result = await instance.acquireTokenPopup({
account,
scopes: [apiScope],
});
return result.accessToken;
}
}
function hasAccount() {
return activeAccount() !== null;
}
async function signOut() {
const instance = requireInstance();
const account = activeAccount();
if (!account) {
return;
}
await instance.logoutPopup({ account });
}
globalThis.emeMsal = {
getAccessToken,
hasAccount,
initialize,
signIn,
signOut,
};