KeySuiteTrousseau
Référence

Référence des scopes et claims

Référence complète des scopes OIDC et des claims disponibles dans Trousseau.

Vue d'ensemble des scopes

Trousseau implémente un modèle de scopes à trois niveaux. Chaque niveau s'appuie sur le précédent.

NiveauScope(s)Description
1openid email profileIdentité OIDC standard. Disponible pour tous les partenaires.
2trousseau:contextIdentifiants de l'écosystème. Opt-in par partenaire.
3trousseau:organizationAppartenances organisationnelles. Opt-in pour les partenaires B2B.

Niveau 1 — OIDC standard

Ces scopes suivent la spécification OpenID Connect Core. Ils fonctionnent avec n'importe quelle bibliothèque cliente OIDC sans personnalisation.

openid (obligatoire)

Toujours requis. Indique à Trousseau de retourner un ID token.

ClaimTypeDescription
substring (UUID)Identifiant unique de l'utilisateur dans Trousseau. Stable entre les sessions.
issstring (URL)URL de l'émetteur — l'émetteur OIDC de votre application.
audstringVotre client ID.
expnumberExpiration du token (timestamp Unix).
iatnumberHeure d'émission du token (timestamp Unix).

email

ClaimTypeDescription
emailstringAdresse e-mail principale de l'utilisateur.
email_verifiedbooleanToujours true. Trousseau vérifie toutes les adresses e-mail.

profile

ClaimTypeDescription
namestringNom d'affichage complet (ex. : "Jean Dupont").
given_namestringPrénom (ex. : "Jean").
family_namestringNom de famille (ex. : "Dupont").
picturestring (URL)URL de l'avatar. Chaîne vide si non défini.

Exemple d'ID token (Niveau 1)

{
  "iss": "https://auth.keysuite.app/application/o/your-slug/",
  "sub": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "aud": "your-slug-oidc",
  "exp": 1712400000,
  "iat": 1712399700,
  "email": "jean.dupont@hotel.com",
  "email_verified": true,
  "name": "Jean Dupont",
  "given_name": "Jean",
  "family_name": "Dupont",
  "picture": "https://auth.keysuite.app/media/avatars/jean-dupont.jpg"
}

Niveau 2 — Contexte Trousseau

Demandez le scope trousseau:context pour recevoir des identifiants à l'échelle de l'écosystème. Cela est utile lorsque votre application a besoin de corréler des utilisateurs entre plusieurs applications connectées à Trousseau.

ClaimTypeDescription
trousseau_user_idstring (UUIDv7)Identifiant utilisateur stable à l'échelle de l'écosystème. Partagé entre toutes les applications connectées à Trousseau. Contrairement à sub (qui est l'UUID interne d'Authentik), cet identifiant est portable et survit aux migrations d'IdP.
localestring (BCP-47)Langue préférée de l'utilisateur (ex. : "fr-FR", "en-GB").

Quand utiliser le Niveau 2

  • Vous avez besoin de faire correspondre des utilisateurs entre plusieurs applications connectées à Trousseau
  • Vous souhaitez prédéfinir la langue de l'interface en fonction des préférences de l'utilisateur
  • Vous avez besoin d'un identifiant utilisateur stable qui ne changera pas si le backend IdP est migré

Exemple d'ID token (Niveau 1 + 2)

{
  "sub": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "email": "jean.dupont@hotel.com",
  "email_verified": true,
  "name": "Jean Dupont",
  "given_name": "Jean",
  "family_name": "Dupont",
  "picture": "https://auth.keysuite.app/media/avatars/jean-dupont.jpg",
  "trousseau_user_id": "018cc251-f400-78cc-8e0c-000fe440ee40",
  "locale": "fr-FR"
}

Niveau 3 — Organisation

Demandez le scope trousseau:organization pour recevoir les appartenances organisationnelles de l'utilisateur dans l'écosystème KeySuite. Ce niveau est conçu pour les partenaires B2B (PMS, outils de gestion hôtelière) ayant besoin de connaître la ou les organisation(s) dans lesquelles travaille l'utilisateur.

ClaimTypeDescription
organizationsarray d'objetsToutes les organisations dont l'utilisateur est membre.

Objet organisation

ChampTypeDescription
idstring (UUIDv7)Identifiant de l'organisation dans KeySuite.
namestringNom d'affichage de l'organisation.
slugstringIdentifiant compatible URL.
rolestringRôle de l'utilisateur dans cette organisation : admin, hr, accounting ou member.

Quand utiliser le Niveau 3

  • Votre application est au service d'une organisation spécifique (hôtel, entreprise)
  • Vous avez besoin de limiter les actions des utilisateurs à un contexte organisationnel
  • Vous souhaitez afficher du contenu ou des permissions spécifiques à l'organisation

Gestion de plusieurs organisations

Un utilisateur peut appartenir à plusieurs organisations. Si votre application est spécifique à une organisation :

  1. Vérifiez si l'utilisateur appartient à votre organisation cible en comparant organizations[].id ou organizations[].slug
  2. Si l'utilisateur appartient à plusieurs organisations, présentez un sélecteur d'organisation
  3. Stockez l'organisation sélectionnée dans la session de votre application

Exemple d'ID token (Niveau 1 + 2 + 3)

{
  "sub": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "email": "jean.dupont@hotel.com",
  "email_verified": true,
  "name": "Jean Dupont",
  "given_name": "Jean",
  "family_name": "Dupont",
  "picture": "https://auth.keysuite.app/media/avatars/jean-dupont.jpg",
  "trousseau_user_id": "018cc251-f400-78cc-8e0c-000fe440ee40",
  "locale": "fr-FR",
  "organizations": [
    {
      "id": "018cc251-f400-78cc-8e0c-000fe440ee40",
      "name": "Hotel Le Grand Paris",
      "slug": "hotel-le-grand-paris",
      "role": "admin"
    },
    {
      "id": "018dd362-a511-89dd-9f1d-111ff551ff51",
      "name": "Hotel Riviera Nice",
      "slug": "hotel-riviera-nice",
      "role": "member"
    }
  ]
}

Disponibilité des claims

Récapitulatif de la disponibilité de chaque claim :

ClaimID TokenUserInfoAccess Token
subOuiOuiNon
emailOuiOuiNon
email_verifiedOuiOuiNon
nameOuiOuiNon
given_nameOuiOuiNon
family_nameOuiOuiNon
pictureOuiOuiNon
trousseau_user_idOuiOuiNon
localeOuiOuiNon
organizationsOuiOuiNon

Tous les claims sont présents à la fois dans l'ID Token (JWT) et dans la réponse de l'endpoint UserInfo. L'access token est opaque et ne contient pas de claims utilisateur.

Demande de scopes

Les scopes sont demandés dans le paramètre scope de la requête d'autorisation, séparés par des espaces :

# Niveau 1 uniquement
scope=openid email profile

# Niveau 1 + 2
scope=openid email profile trousseau:context

# Niveau 1 + 2 + 3
scope=openid email profile trousseau:context trousseau:organization

Vous ne pouvez demander que les scopes qui ont été approuvés pour votre application lors de l'intégration. Demander des scopes non autorisés entraînera une erreur invalid_scope.