Lier une identité fédérée à un utilisateur
POST /v1/users/{user_id}/identities · autorisation users:write
Lie une identité fédérée (le sujet externe d'une connexion sociale, SAML ou OIDC) à l'utilisateur, afin que celui-ci puisse se connecter via cette connexion. linked_via vaut toujours admin_api. La connexion doit être une connexion activée de cet environnement dont le type correspond à type. Si la même identité est déjà liée à cet utilisateur ou à un autre, la requête échoue avec 409 et le propriétaire n'est pas révélé. Le sujet externe est une donnée personnelle : il est stocké chiffré et n'est jamais renvoyé, et l'enregistrement d'audit de gestion user.identity_linked (acteur : la clé d'API) ne le contient pas. La fusion de deux utilisateurs (source_user_id) n'est pas disponible ; un champ inconnu renvoie 400 unknown_field.
Requête
| Paramètre | Dans | Requis | Description |
|---|---|---|---|
user_id |
path | oui | Identifiant de l'utilisateur, préfixé usr_. |
| Champ | Type | Requis | Description |
|---|---|---|---|
type |
string | oui | social, saml ou oidc ; doit correspondre à la connexion (social pour une connexion sociale, saml/oidc pour une connexion entreprise de la même stratégie). |
connection_id |
string | oui | Identifiant de la connexion, préfixé conn_. |
subject |
string | oui | Sujet externe auprès du fournisseur d'identité (OIDC sub, SAML NameID), au maximum 1024 octets en UTF-8. |
Réponse
201 Created avec la nouvelle identité, au format renvoyé par GET /v1/users/{user_id}/identities.
{
"id": "idn_0a1b2c3d4e5f6g7h8j9k0m1n2r",
"type": "oidc",
"connection_id": "conn_0a1b2c3d4e5f6g7h8j9k0m1n2s",
"provider": null,
"linked_via": "admin_api",
"created_at": "2026-01-15T09:30:00Z"
}
Erreurs
Toute erreur est un corps application/problem+json avec un code stable.
| HTTP | code |
Cas |
|---|---|---|
| 400 | malformed_request, unknown_field |
Le corps n'est pas du JSON valide ou contient un champ inconnu. |
| 409 | conflict |
L'identité est déjà liée à un utilisateur (errors[] : identity_already_linked), ou l'utilisateur a atteint la limite d'identités par utilisateur (errors[] : identity_limit_reached). |
| 415 | unsupported_media_type |
Le corps a été envoyé sans Content-Type: application/json. |
| 422 | validation_failed |
Un champ est manquant ou invalide (/type, /connection_id, /subject), ou la connexion n'est pas une connexion activée de cet environnement correspondant à type (errors[] : /connection_id, connection_unavailable). |
| 404 | not_found |
L'utilisateur n'existe pas dans cet environnement, est en cours de suppression, ou l'identifiant est mal formé. |
| 401 | unauthenticated |
La clé d'API est absente, invalide ou révoquée. |
| 403 | insufficient_permissions |
La clé ne dispose pas de l'autorisation users:write. |
| 429 | rate_limited |
La limite de débit a été dépassée ; respectez Retry-After. |
| 503 | service_unavailable |
Une dépendance est temporairement indisponible ; réessayez plus tard. |
Exemple
curl -X POST https://api.eu.keenauth.com/v1/users/usr_0a1b2c3d4e5f6g7h8j9k0m1n2p/identities \
-H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{"type": "oidc", "connection_id": "conn_0a1b2c3d4e5f6g7h8j9k0m1n2s", "subject": "248289761001"}'
Données personnelles
Cet endpoint traite des données personnelles : des identités liées. Données personnelles dans les API KeenAuth décrit ce qui est stocké, la durée de conservation et la manière dont elles sont supprimées. N'envoyez pas de catégories particulières de données personnelles (santé, données biométriques, religion, opinions politiques, orientation sexuelle) dans un champ quelconque.