
# Créer une tâche de réinitialisation du mot de passe en masse

`POST /v1/jobs/password-resets` · autorisation `user-credentials:write`

Oblige plusieurs utilisateurs à choisir un nouveau mot de passe dans une seule tâche asynchrone, par exemple après une fuite suspectée ou pour faire migrer des utilisateurs hors de formats de hachage importés et faibles. La réponse renvoie la tâche immédiatement ; les utilisateurs sont signalés en arrière-plan. Suivez la tâche avec [Obtenir une tâche de réinitialisation du mot de passe en masse](/docs/api/management/jobs/get-password-reset). Pour un seul utilisateur, utilisez [Forcer une réinitialisation du mot de passe](/docs/api/management/users/force-password-reset).

Sélectionnez les utilisateurs de l'une des deux façons (pas les deux) :

- `user_ids` : jusqu'à 100 000 identifiants d'utilisateurs ; les identifiants répétés ne comptent qu'une fois. Les identifiants qui ne sont pas des utilisateurs de cet environnement, et les utilisateurs sans mot de passe, sont comptés comme `not_found`.
- `hash_algos` : chaque utilisateur dont le mot de passe est stocké avec l'un de ces algorithmes et a été modifié pour la dernière fois avant la création de la tâche (par exemple `["md5", "phpass"]`). Un mot de passe défini après la création de la tâche n'est pas sélectionné.

Le filtre `connection_id` n'est pas encore disponible ; une requête qui l'envoie est refusée avec `422 validation_failed` (`not_supported` à `/connection_id`).

Choisissez le `mode` :

- `on_login` : chaque utilisateur sélectionné doit définir un nouveau mot de passe après sa prochaine connexion réussie par mot de passe.
- `lazy_then_bulk_reset` : identique jusqu'à l'échéance (`deadline_days`, 1–365, 30 par défaut). À l'échéance, le hachage de mot de passe de chaque utilisateur sélectionné qui n'a pas encore modifié son mot de passe est supprimé, et un e-mail de réinitialisation est envoyé à son adresse e-mail principale vérifiée (les utilisateurs qui n'en ont pas peuvent toujours demander une réinitialisation eux-mêmes). `deadline_days` n'est accepté que dans ce mode.

`Idempotency-Key` est obligatoire. Les mêmes identifiants, la même clé et la même requête renvoient la même tâche (avec `Idempotent-Replayed: true`) ; la même clé avec une requête différente est refusée avec `422 idempotency_key_reuse`. Un environnement peut avoir au plus 20 tâches non terminées ; une tâche différée reste ouverte jusqu'à son échéance. La création de la tâche est inscrite dans le journal d'audit de gestion (`password_reset_job.created`) et émet l'événement `password_reset.scheduled`.

## Demande

| Champ | Type | Requis | Description |
|---|---|---|---|
| `mode` | string | oui | `on_login` ou `lazy_then_bulk_reset`. |
| `user_ids` | string[] | l'un des deux | 1–100 000 identifiants d'utilisateurs (`usr_…`). |
| `hash_algos` | string[] | l'un des deux | Algorithmes de hachage stockés : `argon2id`, `argon2i`, `bcrypt`, `scrypt`, `firebase_scrypt`, `pbkdf2_sha1`, `pbkdf2_sha256`, `pbkdf2_sha512`, `django_pbkdf2_sha256`, `django_bcrypt_sha256`, `phpass`, `ldap_ssha`, `ldap_ssha256`, `sha512_crypt`, `hmac_sha256`, `salted_sha256`, `salted_sha512`, `md5`. |
| `deadline_days` | integer | non | `lazy_then_bulk_reset` uniquement : 1–365, 30 par défaut. |

## Réponse

`202 Accepted` avec la tâche.

```json
{
  "id": "job_01h455vb4pex5vsknk084sn02q",
  "mode": "lazy_then_bulk_reset",
  "filter": "hash_algo",
  "hash_algos": ["md5", "phpass"],
  "status": "marking",
  "deadline_at": "2026-02-14T09:30:00Z",
  "total": 0,
  "marked": 0,
  "not_found": 0,
  "passwords_deleted": 0,
  "emailed": 0,
  "created_at": "2026-01-15T09:30:00Z"
}
```

## Erreurs

Chaque erreur est un corps `application/problem+json` avec un `code` stable.

| HTTP | `code` | Quand |
|---|---|---|
| 400 | `malformed_request`, `unknown_field` | L'en-tête `Idempotency-Key` est absent ou mal formé, le corps n'est pas du JSON valide, ou il contient un champ inconnu. |
| 401 | `unauthenticated` | La clé d'API est absente, invalide ou révoquée. |
| 403 | `insufficient_permissions` | La clé ne possède pas l'autorisation `user-credentials:write`. |
| 409 | `conflict` | L'environnement compte déjà 20 tâches non terminées. |
| 413 | `payload_too_large` | Le corps dépasse 4 Mio. |
| 422 | `validation_failed` | Un champ est absent ou invalide ; `errors[].pointer` le désigne. |
| 422 | `idempotency_key_reuse` | La `Idempotency-Key` a été utilisée avec une requête différente. |
| 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

```bash
curl -X POST https://api.eu.keenauth.com/v1/jobs/password-resets \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"mode": "lazy_then_bulk_reset", "hash_algos": ["md5", "phpass"], "deadline_days": 30}'
```

CLI : `keenauth jobs password-resets create --mode lazy_then_bulk_reset --hash-algos md5,phpass --deadline-days 30 --yes`
