Obtenir l'état de connexion d'un utilisateur
GET /v1/users/{user_id}/sign-in-state · permission users:read
Renvoie les informations dont votre équipe de support a besoin lorsqu'un utilisateur ne peut pas se connecter : les verrouillages de compte ouverts de l'utilisateur, les compteurs d'échecs encore actifs sur chaque chemin de connexion, et la dernière authentification réussie. L'appel est en lecture seule ; rien n'est modifié et aucun enregistrement d'audit n'est écrit. Pour supprimer les verrouillages, utilisez POST /v1/users/{user_id}:unlock.
La réponse ne contient jamais l'identifiant interne du compteur, une adresse e-mail, une adresse IP, un appareil ni un identifiant de session. Pour les sessions de l'utilisateur, utilisez GET /v1/users/{user_id}/sessions.
Périmètre de l'organisation
Transmettez org_id pour construire une vue de diagnostic des membres destinée à un administrateur d'organisation. La clé doit alors aussi disposer de l'autorisation organizations:read ; sans elle, la requête échoue avec 403 insufficient_permissions avant toute lecture. Si l'utilisateur n'est pas membre de cette organisation (aucune adhésion invited, active ou suspended), la requête échoue avec 404 not_found, la même réponse que pour un utilisateur inconnu. Si l'utilisateur est membre, last_sign_in provient uniquement des sessions dans le contexte de cette organisation, et failures est toujours un tableau vide, car les compteurs d'échecs ne sont rattachés à aucune organisation. Les verrouillages sont tout de même renvoyés, car un verrouillage bloque la connexion du compte dans tous les contextes. Sans org_id, la réponse est inchangée.
Requête
| Paramètre | Dans | Obligatoire | Description |
|---|---|---|---|
user_id |
chemin | oui | Identifiant de l'utilisateur, préfixé usr_. |
org_id |
requête | non | Identifiant de l'organisation, préfixé org_. Limite la vue à cette organisation ; voir Périmètre de l'organisation. Nécessite organizations:read. |
Réponse
200 OK.
{
"locked": true,
"locked_until": "2026-10-20T10:00:00Z",
"locks": [
{"id": "lck_0a1b2c3d4e5f6g7h8j9k0m1n2p", "path": "password",
"locked_at": "2026-10-20T09:45:00Z", "expires_at": "2026-10-20T10:00:00Z"}
],
"failures": [
{"path": "totp", "count": 3, "window_ends_at": "2026-10-20T09:55:00Z"}
],
"last_sign_in": {"authenticated_at": "2026-10-19T18:12:04Z", "amr": ["pwd", "otp"], "country": "DE"}
}
| Champ | Description |
|---|---|
locked |
true lorsqu'au moins un chemin de connexion est verrouillé. |
locked_until |
Moment où se termine le dernier verrouillage ouvert ; null sans verrouillage. |
locks |
Verrouillages ouverts, du plus ancien au plus récent, au maximum un par chemin (password, totp, sms_2fa, email_2fa, otp, recovery_code). |
failures |
Tentatives échouées depuis le dernier succès ou le dernier verrouillage, par chemin, pendant que la fenêtre de comptage est active. Après window_ends_at, le compteur repart de zéro. La fenêtre du mot de passe correspond à brute_force.window_minutes de l'environnement. |
last_sign_in |
La plus récente authentification réussie parmi les sessions encore conservées : authenticated_at (une réauthentification dans la même session la fait avancer), les méthodes d'authentification (amr, RFC 8176) et le dernier pays connu de la session (null si inconnu). null lorsqu'aucune session n'est conservée : l'utilisateur ne s'est jamais connecté, ou la dernière session s'est terminée il y a plus de 30 jours. |
Erreurs
Chaque erreur est un corps application/problem+json avec un code stable.
| HTTP | code |
Quand |
|---|---|---|
| 404 | not_found |
L'utilisateur n'existe pas dans cet environnement (ou l'identifiant est mal formé), ou org_id est fourni et l'utilisateur n'est pas membre de cette organisation. |
| 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:read, ou org_id est fourni et la clé ne dispose pas de organizations:read. |
| 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 https://api.eu.keenauth.com/v1/users/usr_0a1b2c3d4e5f6g7h8j9k0m1n2p/sign-in-state \
-H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
CLI : keenauth users sign-in-state usr_0a1b2c3d4e5f6g7h8j9k0m1n2p