Prévisualiser une politique d'organisation
POST /v1/organizations/{org_id}/policies/{policy_kind}:preview · autorisation organizations:write
Évalue un objet de paramètres candidat sans l'enregistrer. Le corps est le même que pour créer ou remplacer une politique, et le serveur le vérifie avec les mêmes règles et le même contrôle de forfait ; un candidat que PUT rejetterait est donc rejeté ici avec le même code de problème. Rien n'est écrit : ni politique, ni entrée d'audit, ni événement. La requête ne prend ni If-Match ni Idempotency-Key, et la réponse ne contient aucun ETag.
La réponse compte les utilisateurs auxquels le candidat s'applique (basis users_in_scope), et non les utilisateurs qui seraient bloqués, avec une exception : phishing_resistant (voir ci-dessous). Les conditions connues seulement à la connexion, ou que le service de politique ne détient pas, ne sont pas filtrées ; not_evaluated les liste afin que le nombre ne soit jamais lu comme plus élevé qu'il ne l'est.
| Type | Utilisateurs comptés | not_evaluated |
|---|---|---|
authentication_methods |
Membres actifs de l'organisation | credentials |
mfa (required_for admins ou all) |
Membres actifs de l'organisation | mfa_enrollment ; aussi admin_scope pour admins |
phishing_resistant (required_for admins ou all) |
Membres actifs de l'organisation sans identifiant WebAuthn accepté (basis users_without_webauthn, voir ci-dessous) |
credential_policy ; aussi admin_scope pour admins |
sso_enforcement org_context |
Membres actifs de l'organisation, moins bypass_user_ids |
federated_sign_in |
sso_enforcement verified_domains |
Membres actifs, plus utilisateurs actifs de l'environnement disposant d'une adresse e-mail sur un domaine vérifié de cette organisation, moins bypass_user_ids |
federated_sign_in |
session |
Membres actifs de l'organisation | aucun |
ip_allowlist |
Membres actifs de l'organisation | client_ip ; aussi admin_scope pour admins |
Pour phishing_resistant, le nombre et l'échantillon désignent les utilisateurs concernés qui ne peuvent pas aujourd'hui se connecter de manière résistante au hameçonnage : utilisateurs sans identifiant WebAuthn actif (une clé d'accès, ou une clé de sécurité utilisée comme premier facteur) que la liste d'AAGUID accepte. La liste est celle du candidat, ou celle de l'environnement lorsque celle du candidat est vide ; avec une liste, un identifiant ne compte que si son modèle y figure et si son attestation a été vérifiée. Les identifiants en attente, révoqués ou suspectés de clonage ne comptent pas. credential_policy signifie que l'exigence d'attestation de l'environnement, la règle de passkey liée à l'appareil et le statut du modèle d'authentificateur ne sont pas appliqués ; le nombre peut donc être inférieur au nombre d'utilisateurs qui seraient bloqués. Lorsque le périmètre compte plus de 10 000 utilisateurs, la réponse bascule sur users_in_scope avec passkey_enrollment. Si les données d'identifiants ne peuvent pas être lues, la requête échoue avec 503 et aucun nombre n'est renvoyé.
required_for none et mode off ne comptent personne. Un membre actif est un membre dont l'adhésion est active et dont l'utilisateur n'est pas bloqué ; chaque utilisateur n'est compté qu'une fois. admin_scope signifie que admins est compté comme l'ensemble des membres, comme l'applique aujourd'hui la connexion. Les utilisateurs d'une autre organisation ou d'un autre environnement ne sont jamais comptés.
Requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
org_id |
path | oui | Identifiant de l'organisation (org_…). |
policy_kind |
path | oui | Type de politique : authentication_methods, mfa, phishing_resistant, sso_enforcement, session ou ip_allowlist. Toute autre valeur renvoie 404. |
settings |
object | oui | L'objet de paramètres candidat du type, avec les mêmes champs que pour PUT. |
Corps de la requête :
{
"settings": {
"required_for": "all",
"allowed_factors": [
"totp",
"webauthn"
],
"enrollment_grace_days": 7
}
}
Réponse
200 OK. sample contient au plus 20 utilisateurs de l'ensemble compté, triés par identifiant, avec l'identifiant utilisateur uniquement.
| Champ | Type | Description |
|---|---|---|
organization_id |
string | Identifiant de l'organisation (org_…). |
policy_kind |
string | Le type prévisualisé. |
basis |
string | Ce que affected_count compte : users_in_scope ou, pour phishing_resistant, users_without_webauthn. De nouvelles valeurs peuvent être ajoutées. |
affected_count |
integer | Nombre d'utilisateurs que basis compte. |
sample |
array | Au plus 20 objets avec user_id (usr_…). |
not_evaluated |
array | Conditions que le comptage ne filtre pas : admin_scope, credentials, mfa_enrollment, passkey_enrollment, federated_sign_in, client_ip, credential_policy. De nouvelles valeurs peuvent être ajoutées. |
{
"organization_id": "org_01j9xk3m7q8r2s4t6v8w0y2z4a",
"policy_kind": "mfa",
"basis": "users_in_scope",
"affected_count": 2,
"sample": [
{
"user_id": "usr_01j9xk3m7q8r2s4t6v8w0y2z4b"
},
{
"user_id": "usr_01j9xk3m7q8r2s4t6v8w0y2z4c"
}
],
"not_evaluated": [
"mfa_enrollment"
]
}
Erreurs
| HTTP | code | Quand |
|---|---|---|
| 400 | unknown_field |
Le corps contient un champ absent du schéma. |
| 403 | plan_feature_unavailable |
Le type ou la liste d'AAGUID exige un forfait supérieur ; le problème contient feature et required_plan. |
| 404 | not_found |
L'organisation n'existe pas ou le type est inconnu. |
| 409 | domain_not_verified |
sso_enforcement avec mode verified_domains nécessite un domaine vérifié sur l'organisation. |
| 409 | connection_test_required |
Activer sso_enforcement (depuis off ou depuis l'absence de politique) nécessite une connexion de test réussie avec la configuration actuelle d'au moins un des connection_ids au cours des dernières 24 heures. Lancez un test de connexion (POST /v1/connections/{connection_id}:test) puis réessayez. |
| 409 | organization_pending_deletion |
L'organisation attend une suppression en libre-service. |
| 422 | validation_failed |
Un champ de paramètres est inconnu ou invalide ; errors[] pointe vers /settings/…. |
| 422 | policy_weaker_than_parent |
Le paramètre est plus faible que celui de l'environnement ; errors[] pointe vers le champ plus faible. |
| 422 | at_least_one_method |
authentication_methods ne laisse aucune méthode de connexion. |
| 401 | unauthenticated |
L'identifiant est absent, invalide ou révoqué. |
| 403 | insufficient_permissions |
L'identifiant ne dispose pas de l'autorisation requise. |
| 429 | rate_limited |
La limite de débit a été dépassée ; réessayez après la période Retry-After. |
| 503 | service_unavailable |
Une dépendance est temporairement indisponible (pour phishing_resistant, aussi lorsque les données d'identifiants ne peuvent pas être lues) ; réessayez après la période Retry-After. |
Exemple
curl -X POST https://api.eu.keenauth.com/v1/organizations/org_01j9xk3m7q8r2s4t6v8w0y2z4a/policies/mfa:preview \
-H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{"settings":{"required_for":"all","allowed_factors":["totp","webauthn"]}}'
keenauth organizations policies preview org_01j9xk3m7q8r2s4t6v8w0y2z4a mfa \
--data '{"settings":{"required_for":"all","allowed_factors":["totp","webauthn"]}}'