
# Elenca gli autenticatori di un utente

`GET /v1/users/{user_id}/authenticators` · autorizzazione `users:read`

Elenca gli autenticatori (passkey, TOTP, SMS, email e fattori push) di un utente in un'unica pagina, inclusi quelli revocati negli ultimi 90 giorni, ordinati per data di creazione. Il numero di autenticatori per utente è limitato, quindi l'elenco non ha `limit`, `after`, `before` o `order`, e `list_metadata` ha sempre valore `null`. Vengono restituiti solo i metadati: mai chiavi pubbliche, ID delle credenziali, segreti TOTP o codici di recupero.

## Ambito dell'organizzazione

Passa `org_id` per costruire una vista diagnostica dei membri per un amministratore dell'organizzazione. La chiave deve avere anche l'autorizzazione `organizations:read`; altrimenti la richiesta fallisce con `403 insufficient_permissions` prima che venga letto qualsiasi dato. Se l'utente non è membro di quell'organizzazione (nessuna appartenenza `invited`, `active` o `suspended`), la richiesta fallisce con `404 not_found`, la stessa risposta di un utente sconosciuto. Se l'utente è membro, vengono mostrate solo la classe di ciascun autenticatore e se è stato registrato l'MFA: sono elencati solo gli autenticatori attivi, mentre `label`, `last_used_at`, `revoked_at`, `revoked_by` e `revoke_reason` sono `null` e `synced` è `false`, perché i dettagli del dispositivo della persona al di fuori dell'organizzazione non le competono. L'MFA risulta registrato quando un autenticatore attivo ha il `role` `second_factor` o `both`. Senza `org_id` la risposta non cambia.

## Richiesta

| Parametro | In | Obbligatorio | Descrizione |
|---|---|---|---|
| `user_id` | path | sì | ID utente, con prefisso `usr_`. |
| `org_id` | query | no | ID dell'organizzazione, con prefisso `org_`. Limita la vista a quell'organizzazione; vedi [Ambito dell'organizzazione](#ambito-dellorganizzazione). Richiede `organizations:read`. |

## Risposta

`200 OK`. `data` contiene gli autenticatori ordinati per data di creazione; `list_metadata` ha sempre valore `null` perché l'elenco non è paginato. I campi vuoti sono `null`.

Quando la chiave non ha l'autorizzazione `users:read_pii`, `label` viene ridotta alle iniziali (`A. L.`).

```json
{
  "data": [
    {
      "id": "cred_0a1b2c3d4e5f6g7h8j9k0m1n2p",
      "type": "webauthn",
      "role": "both",
      "label": "Laptop",
      "status": "active",
      "synced": true,
      "created_at": "2026-01-15T09:30:00Z",
      "last_used_at": "2026-02-01T08:00:00Z",
      "revoked_at": null,
      "revoked_by": null,
      "revoke_reason": null
    }
  ],
  "list_metadata": {
    "before": null,
    "after": null
  }
}
```

`type`: `webauthn`, `totp`, `sms`, `email`, `push` · `role`: `first_factor`, `second_factor`, `both` · `status`: `pending`, `active`, `revoked`, `clone_suspected`

## Errori

Ogni errore è un corpo `application/problem+json` con un `code` stabile.

| HTTP | `code` | Quando |
|---|---|---|
| 404 | `not_found` | L'utente non esiste in questo ambiente (o l'ID non è valido), oppure `org_id` è presente e l'utente non è membro di quell'organizzazione. |
| 401 | `unauthenticated` | La chiave API manca, non è valida o è stata revocata. |
| 403 | `insufficient_permissions` | La chiave non ha l'autorizzazione `users:read`, oppure `org_id` è presente e la chiave non ha `organizations:read`. |
| 429 | `rate_limited` | È stato superato il limite di richieste; rispetta `Retry-After`. |
| 503 | `service_unavailable` | Una dipendenza non è temporaneamente disponibile; riprova più tardi. |

## Esempio

```bash
curl https://api.eu.keenauth.com/v1/users/usr_0a1b2c3d4e5f6g7h8j9k0m1n2p/authenticators \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"
```

## Dati personali

Questo endpoint tratta dati personali: credenziali. [Dati personali nelle API di KeenAuth](/docs/policies/personal-data) descrive cosa viene memorizzato, per quanto tempo viene conservato e come viene cancellato. Non inviare categorie particolari di dati personali (salute, dati biometrici, religione, opinioni politiche, orientamento sessuale) in nessun campo.
