Appearance
SDK Auth Heriade
Objectif
Le package @heriade-app/auth-sdk centralise l'integration SSO des applications Heriade consommatrices. Il remplace les copies locales de auth-session-client.js, les callbacks login dupliques et les guards backend recodes dans chaque projet.
Le portail SSO et le backend console-admin/back restent la source de verite :
- l'application redirige vers
AUTH_APP_URL/login; - le portail authentifie l'utilisateur avec Supabase;
- le portail appelle
POST /auth-app/authorize; - l'application recoit
#app_access_token=...; - le SDK renouvelle silencieusement ce token via
POST /auth-app/refresh.
Le SDK ne stocke ni mot de passe, ni session Supabase, ni refresh token Supabase cote application consommatrice.
Package
Le code vit dans packages/heriade-auth-sdk.
Exports :
@heriade-app/auth-sdk: client navigateur et helpers communs;@heriade-app/auth-sdk/server: extraction/verification de token et mappingUserContextpour les backends.
Le package est volontairement sans dependance runtime. Il peut etre publie en package prive ou vendorise temporairement par les applications pilotes.
Integration frontend
Exemple minimal :
js
import {
buildAppCallbackUrl,
createHeriadeAuthClient,
} from '@heriade-app/auth-sdk'
const auth = createHeriadeAuthClient({
authUrl: import.meta.env.VITE_AUTH_APP_URL,
apiUrl: import.meta.env.VITE_AUTH_API_URL,
application: 'contacts',
environment: 'default',
storage: 'localStorage',
returnTo: () =>
buildAppCallbackUrl(
window.location.origin,
window.location.pathname + window.location.search,
),
})
const ok = await auth.init()
if (!ok) auth.login({ redirectTo: window.location.pathname })Callback /login/callback :
js
const params = new URLSearchParams(window.location.search)
const result = await auth.handleCallback({
hash: window.location.hash,
redirect: params.get('redirect'),
})
window.history.replaceState(
window.history.state,
'',
`${window.location.pathname}${window.location.search}`,
)
window.location.assign(result.redirect)Appels API :
js
const response = await auth.authFetch('/api/contacts')authFetch ajoute le token, tente un refresh force sur le premier 401, puis rejoue la requete une seule fois. Par defaut le header applicatif reste X-App-Access-Token pour compatibilite avec les apps actuelles. Les nouvelles apps peuvent configurer apiTokenHeader: 'Authorization'.
Integration backend
Mode local JWT, compatible avec l'existant :
js
import {
buildUserContextFromPayload,
extractAppAccessToken,
verifyAppAccessToken,
} from '@heriade-app/auth-sdk/server'
const token = extractAppAccessToken(request.headers)
const payload = verifyAppAccessToken(token, {
secret: process.env.APP_ACCESS_TOKEN_SECRET,
application: process.env.APPLICATION,
environment: process.env.ENVIRONMENT,
})
if (!payload) throw new UnauthorizedException()
request.userCtx = buildUserContextFromPayload(payload)Mode centralise recommande pour les apps sensibles :
http
POST /auth-app/context
x-auth-introspection-secret: <secret>
{ "token": "<app_access_token>" }Reponse :
json
{
"active": true,
"user": {
"userId": "uuid",
"accountId": 12,
"enterpriseId": 66,
"enterpriseName": "Heriade",
"accountType": "enterprise",
"role": "administrateur",
"isAdmin": true,
"isSuperAdmin": false,
"email": "[email protected]",
"application": "contacts",
"environment": "default"
}
}Ce mode evite de dupliquer le mapping des claims et tient compte de la table user_token_revocations.
Securite
Le SDK durcit les points qui avaient tendance a diverger par projet :
- nettoyage du hash
#app_access_tokenapres callback; - refus des redirects externes (
https://...,//..., caracteres de controle); - refresh concurrent deduplique;
- retry applicatif limite a un seul rejeu;
- distinction entre expiration reelle, refus d'acces et indisponibilite temporaire;
- stockage configurable : memoire,
sessionStorage,localStorageou adapter custom; - logs sans token brut cote backend consommateur.
Variables
Frontend :
env
AUTH_APP_URL=https://auth.heriade.fr
AUTH_API_URL=https://api.console.heriade.fr
APPLICATION=contacts
ENVIRONMENT=defaultBackend consommateur :
env
APPLICATION=contacts
ENVIRONMENT=default
APP_ACCESS_TOKEN_SECRET=...
AUTH_INTROSPECTION_SECRET=...
CONSOLE_ADMIN_URL=https://api.console.heriade.frAPP_ACCESS_TOKEN_SECRET reste requis pour le mode local JWT. A moyen terme, il faudra remplacer le secret partage par une signature asymetrique et un JWKS.
Migration d'une application existante
- installer ou vendoriser
@heriade-app/auth-sdk; - remplacer la copie locale
auth-session-client.js; - remplacer les pages login/callback par les wrappers SDK;
- remplacer le wrapper fetch par
auth.authFetch; - remplacer le guard backend custom par les helpers serveur ou par
/auth-app/context; - lancer les tests e2e : login, callback, refresh silencieux, 401 retry, logout global, switch de compte.
