Endpoints OAuth, OIDC et SAML
La table de référence de tous les endpoints publics du protocole, les types de grant du token endpoint, et les surfaces SAML et SCIM.
Tous les endpoints de protocole vivent sur votre domaine de connexion. Les exemples utilisent https://accounts.obexal.com, le domaine par défaut : si votre organisation utilise un domaine personnalisé, il remplace cet hôte partout, y compris dans l'issuer.
Découverte
Deux documents publics sont le point d'entrée de toute intégration :
curl https://accounts.obexal.com/.well-known/openid-configuration
curl https://accounts.obexal.com/.well-known/jwks.jsonLe document de découverte annonce les capacités exactes de la plateforme :
| Champ de découverte | Valeur |
|---|---|
response_types_supported | code (flux authorization code uniquement) |
grant_types_supported | authorization_code, refresh_token, client_credentials, urn:ietf:params:oauth:grant-type:token-exchange |
code_challenge_methods_supported | S256 |
id_token_signing_alg_values_supported | RS256 (aucun autre algorithme n'est accepté) |
scopes_supported | openid, profile, email |
token_endpoint_auth_methods_supported | none, client_secret_basic, client_secret_post, private_key_jwt |
dpop_signing_alg_values_supported | ES256, RS256 |
backchannel_logout_supported | true (voir plus bas) |
Endpoints OAuth 2.1 et OIDC
| Méthode | Chemin | Rôle | Authentification |
|---|---|---|---|
| GET | /.well-known/openid-configuration | Document de découverte OIDC | Aucune (public) |
| GET | /.well-known/jwks.json | Clés publiques de signature (JWKS) | Aucune (public) |
| GET | /oauth/authorize | Endpoint d'autorisation (code + PKCE) | Session navigateur (redirige vers la connexion si absente) |
| POST | /oauth/par | Pushed authorization requests (RFC 9126) | Authentification du client |
| POST | /oauth/token | Token endpoint (tous les grants) | Authentification du client (voir plus bas) |
| GET | /oauth/userinfo | Claims OIDC de l'utilisateur | Jeton d'accès (schéma Bearer ou DPoP) |
| POST | /oauth/introspect | Introspection de jeton (RFC 7662) | Identifiants d'un client confidentiel uniquement |
| POST | /oauth/revoke | Révocation du refresh token (RFC 7009, toujours 200) | Identifiants du client |
| GET | /oauth/logout | Déconnexion initiée par le RP (end_session_endpoint) | Session navigateur (optionnelle, idempotent) |
/oauth/authorize accepte aussi un request_uri obtenu via /oauth/par (usage unique) ; les autres paramètres de requête sont alors ignorés. /oauth/logout accepte client_id, post_logout_redirect_uri (validée contre la liste enregistrée du client) et state.
Types de grant du token endpoint
POST /oauth/token prend un corps form-encoded et renvoie du JSON avec Cache-Control: no-store. Le paramètre grant_type sélectionne le flux :
| grant_type | Usage | Paramètres spécifiques |
|---|---|---|
authorization_code | Connecter un utilisateur | code (requis, usage unique), redirect_uri (correspondance exacte avec la requête d'authorize), code_verifier (requis, PKCE S256) |
refresh_token | Renouveler les jetons, avec rotation et détection de réutilisation | refresh_token (requis), scope (optionnel, sous-ensemble des scopes initiaux) |
client_credentials | Identité machine, sans utilisateur | scope (optionnel, sous-ensemble des scopes du client) ; clients confidentiels uniquement, aucun refresh token émis |
urn:ietf:params:oauth:grant-type:token-exchange | Jetons délégués pour agents IA (RFC 8693) | subject_token (requis), subject_token_type et requested_token_type (optionnels, URN access_token uniquement), scope (réduction de périmètre optionnelle), resource (audience cible optionnelle, RFC 8707) |
L'authentification du client supporte client_secret_basic, client_secret_post, private_key_jwt (assertion signée, RFC 7523) et none pour les clients publics, qui reposent sur PKCE seul. Sur tout grant, un en-tête DPoP optionnel lie le jeton émis à la clé du client (claim cnf.jkt) et le token_type devient DPoP au lieu de Bearer. Voir Sécurité avancée des clients.
curl -X POST https://accounts.obexal.com/oauth/token \
-d grant_type=client_credentials \
-d client_id=svc-reporting \
-d client_secret="$CLIENT_SECRET"{"access_token": "eyJhbGciOiJSUzI1NiIs...", "token_type": "Bearer", "expires_in": 600, "scope": "reports:read"}Seuls authorization_code et refresh_token renvoient un refresh token et, avec le scope openid, un ID token. Les réponses Token Exchange ajoutent issued_token_type. Les réponses d'erreur utilisent la forme OAuth (error, error_description) : voir Erreurs et limites, et Valider les jetons pour consommer ce que vous recevez.
Déconnexion back-channel
La déconnexion back-channel est émise, pas reçue : il n'existe aucun endpoint entrant de déconnexion. Quand la session d'un utilisateur se termine, Obexal envoie en POST un logout_token signé (JWT, typ: logout+jwt, RS256) à la backchannel_logout_uri enregistrée sur chaque application à laquelle l'utilisateur avait consenti. La déconnexion est indexée par sub, pas par session (backchannel_logout_session_supported: false). Voir Sessions et déconnexion.
Endpoints SAML 2.0
Dans les chemins ci-dessous, {tenant} est le slug de votre organisation.
Obexal comme fournisseur d'identité (SSO sortant, voir IdP SAML) :
| Méthode | Chemin | Rôle | Authentification |
|---|---|---|---|
| GET | /saml/idp/{tenant}/metadata | Métadonnées IdP (XML) | Aucune (public) |
| GET, POST | /saml/idp/{tenant}/sso | Endpoint SSO, initié par le SP | Session navigateur (redirige vers la connexion si absente) |
| GET | /saml/idp/{tenant}/apps/{appId}/sso | SSO initié par l'IdP pour une app enregistrée | Session navigateur |
Obexal comme service provider (SSO d'entreprise entrant, voir SP SAML) :
| Méthode | Chemin | Rôle | Authentification |
|---|---|---|---|
| GET | /saml/{tenant}/metadata | Métadonnées SP (XML) | Aucune (public) |
| GET | /saml/{tenant}/login | Démarre la connexion auprès de l'IdP d'entreprise | Aucune (démarre le flux) |
| POST | /saml/{tenant}/acs | Assertion consumer service | Assertion SAML signée par l'IdP |
Il n'existe aucun endpoint SAML Single Logout (SLO), ni entrant ni sortant.
SCIM 2.0
Le provisioning entrant est servi sous /scim/v2 (ressource Users uniquement), authentifié par un bearer token propre au tenant. La surface complète, le schéma d'attributs et les limites sont documentés dans la référence SCIM.