Le flow
Authorization Code + PKCE, puis échange contre un JWT d'organisation.
Oreus implémente Authorization Code Flow avec PKCE. Aucun autre flow n'est
à utiliser : implicit est déprécié, et client_credentials ne concerne que
les services agissant pour eux-mêmes, sans utilisateur.
Vue d'ensemble
Les redirections sont traversées par le navigateur. Le dernier échange, lui, est
un appel direct : le code_verifier — et le client_secret s'il y en a un
— n'apparaissent jamais dans une URL.
Requête d'autorisation
GET https://oreus-sso.dev2.dev-id.fr/oidc/auth
?client_id=<APP_ID>
&redirect_uri=<REDIRECT_URI>
&response_type=code
&scope=openid profile email offline_access urn:logto:scope:organizations
&state=<aléatoire>
&nonce=<aléatoire>
&code_challenge=<BASE64URL(SHA256(code_verifier))>
&code_challenge_method=S256
&resource=<API_RESOURCE>
&prompt=consentTrois paramètres méritent une explication :
resource— indicateur de ressource (RFC 8707). Sans lui, l'access token ne vaut que pouruserinfo, pas pour l'API.prompt=consent— obligatoire pour obtenir un refresh token : sans lui, le scopeoffline_accessest ignoré silencieusement.state— à vérifier au retour. C'est la protection CSRF du flow.
Échange du code
POST https://oreus-sso.dev2.dev-id.fr/oidc/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&code=<CODE>
&redirect_uri=<REDIRECT_URI>
&client_id=<APP_ID>
&code_verifier=<VERIFIER>Un client confidentiel ajoute client_secret. Le code est à usage unique et
expire en une minute environ.
Jeton d'organisation
C'est l'étape que l'on oublie. L'access token issu du flow porte l'audience de la ressource, mais pas de contexte d'organisation. L'API en a besoin.
POST https://oreus-sso.dev2.dev-id.fr/oidc/token
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token
&client_id=<APP_ID>
&refresh_token=<REFRESH_TOKEN>
&organization_id=<ORG_ID>
&resource=<API_RESOURCE>Les identifiants d'organisation disponibles se lisent dans le claim
organizations de l'access token ou de l'id_token.
Chaque échange renvoie un nouveau refresh token et invalide l'ancien. Il faut le reporter dans la session, sinon l'échange suivant rejoue un jeton consommé — et Oreus révoque alors toute la famille de jetons.
Déconnexion
GET https://oreus-sso.dev2.dev-id.fr/oidc/session/end
?client_id=<APP_ID>
&id_token_hint=<ID_TOKEN>
&post_logout_redirect_uri=<POST_LOGOUT_URI>Effacer la session locale ne suffit pas : sans cet appel, la session reste ouverte côté Oreus et la reconnexion est instantanée.