Obtenir les diagnostics d'un membre
GET /v1/organizations/{org_id}/memberships/{membership_id}/diagnostics · autorisations organizations:read et users:read
Répond à la question « pourquoi ce membre ne peut-il pas se connecter ? » pour un administrateur d'organisation en une seule réponse : l'appartenance, une synthèse des politiques de l'organisation, une invitation en attente, une synthèse des authentificateurs du membre, l'état de connexion dans le contexte de l'organisation, les groupes d'annuaire du membre et son accès aux applications. Elle est en lecture seule : rien ne change, et les actions d'écriture passent par leurs propres points de terminaison. L'activité de connexion se lit avec Lister les journaux d'un utilisateur et org_id.
Seules les données qui appartiennent à l'organisation sont renvoyées. Les libellés, AAGUID, adresses IP, agents utilisateur, adresses e-mail, plages CIDR et enregistrements issus du contexte d'une autre organisation ne figurent jamais dans la réponse.
Requête
| Champ | Type | Requis | Description |
|---|---|---|---|
org_id |
chemin | oui | Identifiant de l'organisation (org_…). |
membership_id |
chemin | oui | Identifiant de l'appartenance (mem_…). |
Aucun corps de requête.
Réponse
200 OK avec les champs suivants :
| Champ | Description |
|---|---|
membership |
L'appartenance telle que la renvoie Obtenir une appartenance : statut, source, rôles et motif de suspension. |
policy |
Les politiques définies sur l'organisation : authentication_methods (clés d'accès et mots de passe autorisés, nombre de connexions autorisées), mfa (qui doit utiliser l'authentification multifacteur et les facteurs autorisés), phishing_resistant, sso_enforcement (mode, et bypass lorsque le membre figure sur la liste de secours d'urgence) et ip_allowlist (présent, et à qui il s'applique). null signifie que l'organisation hérite de la valeur de l'environnement pour cette politique. |
invitation |
Uniquement pour une appartenance invited : l'invitation en attente envoyée à l'adresse e-mail principale de l'utilisateur, avec son envoi et son statut de remise. null sinon. L'adresse e-mail n'est pas renvoyée. |
authenticators |
classes : les types des authentificateurs actifs du membre. mfa_enrolled : true lorsqu'un authentificateur actif a le rôle second_factor ou both. |
sign_in |
locked et locked_until (un verrou bloque la connexion du compte dans tous les contextes), ainsi que la dernière connexion dans le contexte de cette organisation (last_sign_in_at, last_sign_in_amr). Les compteurs d'échecs ne sont pas affichés, car ils n'appartiennent à aucune organisation. |
groups |
Les groupes du membre dans les annuaires de l'organisation (data : id dsg_… et directory_id dir_… ; 100 au maximum, truncated s'il y en a davantage). Seules les appartenances d'un utilisateur d'annuaire lié à cet utilisateur et actif sont comptées. Les noms des groupes ne sont pas renvoyés ; lisez-les avec GET /v1/directories/{directory_id}/groups/{directory_group_id}. |
applications |
L'accès aux applications de cette organisation. Les applications dont org_access_mode est all_organizations sont ouvertes à tous les membres et seulement comptées (open_count). Pour les autres applications (data, par nom, 100 au maximum, truncated s'il y en a davantage) : application_id, name, access_mode, allowed, et reason lorsque l'accès est refusé (application_not_enabled : l'application n'est pas activée pour l'organisation ; application_not_assigned : ni l'appartenance ni l'un de ses groupes d'annuaire n'est assigné). La décision suit la même règle que la vérification lors de la connexion. |
{
"membership": {
"id": "mem_01j9xn5p9s0t4v6w8x0y2z4a6c",
"organization_id": "org_01j9xk3m7q8r2s4t6v8w0y2z4a",
"user_id": "usr_01j9xh2k6p7q1r3s5t7v9w1x3y",
"status": "suspended",
"source": "scim",
"reason": "scim_deprovisioned",
"roles": [],
"expires_at": null,
"created_at": "2026-10-12T09:31:00.123456Z",
"activated_at": "2026-10-12T09:31:00.123456Z",
"suspended_at": "2026-10-20T07:00:00Z",
"removed_at": null,
"updated_at": "2026-10-20T07:00:00Z",
"version": 3
},
"policy": {
"authentication_methods": null,
"mfa": { "required_for": "all", "allowed_factors": ["totp", "webauthn"] },
"phishing_resistant": null,
"sso_enforcement": { "mode": "org_context", "bypass": false },
"ip_allowlist": null
},
"invitation": null,
"authenticators": { "mfa_enrolled": false, "classes": ["webauthn"] },
"sign_in": {
"locked": false,
"locked_until": null,
"last_sign_in_at": "2026-10-19T08:15:42Z",
"last_sign_in_amr": ["fed"]
},
"groups": {
"data": [{ "id": "dsg_01j9xp4r8s2t4v6w8x0y2z4a6b", "directory_id": "dir_01j9xm1n5p7q9r1s3t5v7w9x1y" }],
"truncated": false
},
"applications": {
"open_count": 2,
"data": [
{
"application_id": "app_01j9xq6s0t2v4w6x8y0z2a4b6c",
"name": "Finance portal",
"access_mode": "assigned_only",
"allowed": false,
"reason": "application_not_assigned"
}
],
"truncated": false
}
}
Erreurs
| HTTP | code | Quand |
|---|---|---|
| 404 | not_found |
L'appartenance n'existe pas dans cette organisation, ou elle est removed. |
| 401 | unauthenticated |
L'identifiant est absent, invalide ou révoqué. |
| 403 | insufficient_permissions |
L'identifiant ne dispose pas de organizations:read ou de users:read. |
| 429 | rate_limited |
La limite de débit a été dépassée ; réessayer après la période Retry-After. |
| 503 | service_unavailable |
Une dépendance est temporairement indisponible ; réessayer après la période Retry-After. |
Exemple
curl -i "https://api.eu.keenauth.com/v1/organizations/org_01j9xk3m7q8r2s4t6v8w0y2z4a/memberships/mem_01j9xn5p9s0t4v6w8x0y2z4a6c/diagnostics" \
-H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
Données personnelles
Ce point de terminaison traite des données personnelles : appartenances à des organisations, invitations et identifiants. Données personnelles dans les API KeenAuth décrit ce qui est stocké, combien de temps ces données sont conservées et comment elles sont supprimées. N'envoyez aucune catégorie particulière de données personnelles (santé, données biométriques, religion, opinions politiques, orientation sexuelle) dans aucun champ.