Exécuter une étape de connexion

POST /fapi/v1/transactions/current/steps/{step} · appelé depuis l'hôte de connexion de l'environnement

Exécute une étape de la transaction en cours. Cette version accepte les étapes identifier et password. Chaque étape d'identifiants en échec renvoie le même 401 invalid_credentials, de sorte que la réponse ne révèle jamais si un compte existe. Lorsque l'étape du mot de passe termine la transaction, les cookies de session __Host-idp_session (et, si nécessaire, __Host-idp_device) sont définis et le cookie de transaction est supprimé.

Requête

En-têtes :

En-tête Obligatoire Description
Idp-Client oui Identifiant du SDK.
Origin oui Doit être exactement https://<sign-in host>.
Idp-Csrf-Token oui Le csrf_token de l'objet de transaction.

Chemin : step, le nom de l'étape (identifier, password, sso_start).

À l'étape otp_send, next_steps[].methods liste les méthodes sans mot de passe autorisées par la politique effective (email_otp, magic_link) ; un client ne propose que celles-ci.

Corps (les champs dépendent de l'étape ; next_steps[].fields les énumère) :

Champ Type Description
identifier chaîne Adresse e-mail, numéro de téléphone ou nom d'utilisateur (étape identifier), 320 caractères au maximum.
password chaîne Le mot de passe (étape password), 128 caractères au maximum.
connection_id chaîne Une valeur sso_connections[].connection_id (étape sso_start).

Réponse

200 OK avec la transaction après l'étape. Une transaction completed n'a pas de csrf_token.

Lorsque l'environnement exige un second facteur et que l'utilisateur n'en a pas encore, un utilisateur encore dans le mfa.enrollment_grace_days de l'environnement se connecte malgré tout et la réponse completed contient mfa_enrollment : required_by (RFC 3339, fin de la période de grâce, calculée par le serveur) et methods (webauthn, totp : les facteurs que l'utilisateur peut inscrire maintenant, dans l'ordre de l'écran). Affichez la date et laissez l'utilisateur continuer ; l'inscription se fait dans les paramètres du compte. Le champ est absent lorsqu'il n'y a pas de période de grâce, que l'utilisateur respecte la politique, ou que l'inscription est exigée immédiatement. Le min_acr d'une application et le acr_values demandé ne sont jamais reportés par la période de grâce.

SSO d'entreprise (découverte du domaine)

Lorsque l'étape identifier reçoit une adresse e-mail dont le domaine appartient à une connexion d'entreprise, la connexion se poursuit avec cette connexion. Seule la partie après @ est utilisée pour la découverte.

Lorsque la demande de connexion désigne une organisation qui exige le SSO, la transaction ne propose que les connexions de cette organisation : les étapes du mot de passe et du code par e-mail ne sont pas proposées, et la clé d'accès ne reste disponible que si l'organisation dispose de comptes d'urgence (break-glass). La création de la transaction démarre déjà l'unique connexion (federated_redirect avec redirect_url) ou en liste plusieurs dans sso_connections ; envoyez le choix avec sso_start et connection_id seuls, identifier est facultatif ici. Sous cette exigence, la découverte ne revient pas à d'autres méthodes : lorsque la connexion d'entreprise est inaccessible, l'étape renvoie 503 temporarily_unavailable. Il en va de même lorsque le domaine de l'e-mail appartient à une organisation qui exige le SSO pour ses domaines vérifiés.

Après le fournisseur d'identité, le navigateur revient vers /u/sso/complete sur l'hôte de connexion ; la page hébergée termine la connexion.

Lier la connexion d'entreprise à un compte existant

Lorsqu'une connexion d'entreprise ne garantit pas les adresses e-mail et que l'adresse qu'elle affirme est déjà vérifiée sur un compte de l'environnement, la connexion d'entreprise n'ouvre pas de session. Le navigateur revient vers la page de connexion hébergée avec une nouvelle transaction dont l'objet contient account_link : connection_name et, lorsque la connexion appartient à une organisation, organization_name. Indiquez à l'utilisateur qu'il possède déjà un compte et qu'il doit s'y connecter pour lier la connexion ; ne nommez jamais le compte. Dans cette transaction, sso_start et magic_link ne sont pas proposés, et l'étape identifier n'oriente pas vers une connexion d'entreprise.

L'utilisateur se connecte au compte existant avec ses propres méthodes ; un utilisateur qui a un second facteur inscrit doit le fournir. L'étape qui termine la transaction n'ouvre aucune session : la connexion est liée au compte, et la réponse est une nouvelle transaction en federated_redirect avec redirect_url pour la même connexion. Naviguez vers cette transaction dans la fenêtre de premier niveau ; la connexion d'entreprise se termine alors normalement. Si la connexion d'entreprise ne peut pas démarrer, la nouvelle transaction est identifier_pending et une connexion ordinaire suit.

Une finalisation avec un autre compte, sans le second facteur inscrit, ou avec une connexion plus ancienne que la demande de liaison, ne lie rien et n'ouvre aucune session : 409 transaction_state_conflict. Une demande de liaison expirée (10 minutes) ou déjà utilisée renvoie 410 transaction_expired. Une demande de liaison est utilisée une seule fois, quel que soit le résultat. Pour refuser, appelez POST /fapi/v1/transactions/current:cancel.

Politique de l'organisation

Lorsque la demande d'autorisation est liée à une organisation, la politique de connexion de l'organisation est vérifiée à nouveau après le premier facteur et juste avant l'ouverture de la session :

Aucune session n'est ouverte. Un refus lors de la finalisation de la transaction supprime le cookie de transaction ; un 503 après le premier facteur laisse la transaction en place, et l'étape peut être relancée. Le corps d'erreur ne nomme jamais l'organisation, l'utilisateur ni l'adresse IP.

Transactions sans interface liées à DPoP

Pour une transaction démarrée avec un en-tête DPoP, envoyez une nouvelle preuve avec la même clé (htm POST, htu l'URL de l'étape) au lieu de Idp-Csrf-Token ; aucun cookie n'est utilisé. L'étape qui termine la transaction renvoie authorization_response une seule fois :

{
  "state": "completed",
  "authorization_response": { "code": "<code>", "state": "<your state>", "iss": "https://example.keenauth.app" },
  "next_steps": [],
  "schema_version": 1,
  "expires_at": "2026-11-02T10:15:00Z"
}

Vérifiez que state et iss correspondent, puis échangez le code à /oauth2/token avec votre code_verifier et une preuve DPoP issue de la même clé. Une preuve issue d'une autre clé renvoie invalid_grant. Si la demande d'autorisation ne peut pas aboutir à un code (consentement, conditions légales, choix d'organisation ou nouvelle connexion nécessaires, ou accès refusé), l'étape renvoie 403 authorization_failed et le membre error contient le code d'erreur OAuth ; aucun code n'est émis.

Erreurs

Statut Code Quand
401 invalid_credentials L'identifiant ou le mot de passe n'est pas accepté.
403 origin_not_allowed Origin ou Idp-Csrf-Token est absent ou incorrect.
403 ip_not_allowed L'adresse IP du client ne figure pas dans la liste d'autorisation de l'organisation.
403 no_allowed_method La connexion ne respecte pas la politique de l'organisation.
403 test_feature_not_in_production otp_verify ou email_2fa a reçu le code de test fixe 424242 dans un environnement de production. La tentative est comptée comme un code erroné.
404 not_found Le nom de l'étape n'est pas connu.
409 transaction_state_conflict L'étape n'est pas disponible dans l'état actuel.
409 session_limit_reached L'utilisateur a atteint la limite de sessions et les nouvelles sessions sont refusées.
410 transaction_expired La transaction est terminée.
422 validation_failed Un champ est absent ou invalide.
503 temporarily_unavailable sso_start n'a pas pu joindre la connexion d'entreprise, ou la politique de l'organisation n'a pas pu être lue ; réessayez.
401 invalid_dpop_proof La preuve DPoP est absente, invalide ou réutilisée.
403 authorization_failed La transaction liée à DPoP s'est terminée, mais sa demande d'autorisation s'est achevée sans code.

Exemple

curl -X POST https://example.keenauth.app/fapi/v1/transactions/current/steps/identifier \
  -H "Idp-Client: my-app/1.0.0 (node/22.0.0)" \
  -H "Origin: https://example.keenauth.app" \
  -H "Idp-Csrf-Token: $CSRF_TOKEN" \
  -H "Content-Type: application/json" \
  -b cookies.txt \
  -d '{"identifier":"jane@example.com"}'

Données personnelles

Ce point de terminaison traite des données personnelles : profil de l'utilisateur final et identifiants. Données personnelles dans les API KeenAuth décrit ce qui est stocké, la durée de conservation et la suppression. Ne transmettez aucune catégorie particulière de données personnelles (santé, données biométriques, religion, opinions politiques, orientation sexuelle) dans aucun champ.