Désactiver ou supprimer un utilisateur
Ce guide couvre les deux façons de mettre fin à l'accès d'un utilisateur à une organisation via l'API :
- Désactivation — suspend l'accès de manière réversible. L'enregistrement de l'utilisateur est conservé et peut être réactivé à tout moment.
- Suppression — retire définitivement l'utilisateur et son accès.
- Un jeu valide d'identifiants API
- Un jeton d'accès valide (voir : Obtenir un jeton) avec le périmètre
stonal.user.write - Un code d'organisation
Choisir entre la désactivation et la suppression
| Désactivation | Suppression | |
|---|---|---|
| Réversible ? | Oui — réactivable à tout moment | Non — définitive |
| Enregistrement utilisateur | Conservé (exposé via disabled) | Supprimé |
| Périmètre | L'organisation indiquée dans le chemin de la requête | L'organisation indiquée dans le chemin de la requête |
| Usage typique | Suspension temporaire (congé, départ en cours, appareil perdu) | Suppression définitive |
Étape 1 : Récupérer l'UID de l'utilisateur
Les deux opérations nécessitent l'UID de l'utilisateur. Recherchez l'utilisateur pour l'obtenir.
Voir : Trouver un utilisateur existant
GET /v2/organizations/DEMO/users?pageNumber=1&pageSize=10&q=john.doe@example.com
Si l'utilisateur existe, vous recevrez une réponse 200 avec les détails de l'utilisateur, y compris son UID et son état disabled actuel.
Désactiver un utilisateur
Comment fonctionne la désactivation
La désactivation est limitée à une seule organisation. L'opération positionne un indicateur sur l'accès de l'utilisateur dans l'organisation indiquée dans le chemin de la requête ; l'utilisateur perd immédiatement l'accès aux objets, applications et rapports de cette organisation. Son accès dans toute autre organisation n'est pas affecté.
Comme une identité Stonal est un compte de connexion unique partagé entre toutes les organisations auxquelles la personne appartient, le compte sous-jacent n'est désactivé — empêchant toute connexion — qu'une fois l'utilisateur désactivé dans toutes ses organisations. Dès qu'il est réactivé dans l'une d'elles, la connexion est rétablie.
Quelques points à garder à l'esprit :
- Toujours visible — les utilisateurs désactivés continuent d'apparaître dans les listes d'utilisateurs avec
disabled: true, ce qui vous permet de les retrouver et de les réactiver. - Révocation différée — les vérifications de permissions sont mises en cache jusqu'à ~1 minute ; l'accès est donc entièrement révoqué sous ~60 secondes (le même comportement que la suppression).
- Pas d'auto-désactivation — vous ne pouvez pas désactiver le compte avec lequel vous êtes authentifié (renvoie
409). - v2 uniquement — les points de terminaison de désactivation et de réactivation sont disponibles sur l'API v2.
Désactiver l'utilisateur
Voir : Spécification de l'API
POST /v2/organizations/DEMO/users/5dbbc53c-1a22-4f6f-883c-74c04fe905f5/disable
- Python
- PHP
- JavaScript
- Java
- Go
- C#
import requests
BASE_URL = "https://api.stonal.io/users"
TOKEN = "<access_token>"
resp = requests.post(
f"{BASE_URL}/v2/organizations/DEMO/users/5dbbc53c-1a22-4f6f-883c-74c04fe905f5/disable",
headers={"Authorization": f"Bearer {TOKEN}"},
)
print(resp.status_code)
<?php
$baseUrl = "https://api.stonal.io/users";
$token = "<access_token>";
$ch = curl_init("$baseUrl/v2/organizations/DEMO/users/5dbbc53c-1a22-4f6f-883c-74c04fe905f5/disable");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => ["Authorization: Bearer $token"],
]);
$response = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
curl_close($ch);
const baseUrl = "https://api.stonal.io/users";
const token = "<access_token>";
const res = await fetch(
`${baseUrl}/v2/organizations/DEMO/users/5dbbc53c-1a22-4f6f-883c-74c04fe905f5/disable`,
{
method: "POST",
headers: { Authorization: `Bearer ${token}` },
}
);
console.log(res.status);
import java.net.URI;
import java.net.http.*;
String baseUrl = "https://api.stonal.io/users";
String token = "<access_token>";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(baseUrl + "/v2/organizations/DEMO/users/5dbbc53c-1a22-4f6f-883c-74c04fe905f5/disable"))
.header("Authorization", "Bearer " + token)
.POST(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
package main
import (
"fmt"
"net/http"
)
func main() {
baseURL := "https://api.stonal.io/users"
token := "<access_token>"
req, _ := http.NewRequest("POST", baseURL+"/v2/organizations/DEMO/users/5dbbc53c-1a22-4f6f-883c-74c04fe905f5/disable", nil)
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println(resp.StatusCode)
}
using System.Net.Http;
using System.Net.Http.Headers;
var baseUrl = "https://api.stonal.io/users";
var token = "<access_token>";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var response = await client.PostAsync($"{baseUrl}/v2/organizations/DEMO/users/5dbbc53c-1a22-4f6f-883c-74c04fe905f5/disable", null);
Console.WriteLine((int)response.StatusCode);
Paramètres de chemin :
organizationCode: Votre code client (par ex. « DEMO »)uid: UID de l'utilisateur à désactiver (par ex. « 5dbbc53c-1a22-4f6f-883c-74c04fe905f5 »)
Réponses possibles :
- 204 : L'utilisateur a été désactivé avec succès
- 404 : L'utilisateur à désactiver n'existe pas
- 409 : L'utilisateur ne peut pas être désactivé (par exemple, vous ne pouvez pas désactiver votre propre compte)
Réactiver l'utilisateur
Pour rétablir l'accès, appelez le point de terminaison enable avec le même UID. Cela efface l'indicateur de désactivation dans l'organisation et, si le compte de connexion de l'utilisateur avait été désactivé, le rétablit afin qu'il puisse de nouveau s'authentifier.
Voir : Spécification de l'API
POST /v2/organizations/DEMO/users/5dbbc53c-1a22-4f6f-883c-74c04fe905f5/enable
- Python
- PHP
- JavaScript
- Java
- Go
- C#
import requests
BASE_URL = "https://api.stonal.io/users"
TOKEN = "<access_token>"
resp = requests.post(
f"{BASE_URL}/v2/organizations/DEMO/users/5dbbc53c-1a22-4f6f-883c-74c04fe905f5/enable",
headers={"Authorization": f"Bearer {TOKEN}"},
)
print(resp.status_code)
<?php
$baseUrl = "https://api.stonal.io/users";
$token = "<access_token>";
$ch = curl_init("$baseUrl/v2/organizations/DEMO/users/5dbbc53c-1a22-4f6f-883c-74c04fe905f5/enable");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => ["Authorization: Bearer $token"],
]);
$response = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
curl_close($ch);
const baseUrl = "https://api.stonal.io/users";
const token = "<access_token>";
const res = await fetch(
`${baseUrl}/v2/organizations/DEMO/users/5dbbc53c-1a22-4f6f-883c-74c04fe905f5/enable`,
{
method: "POST",
headers: { Authorization: `Bearer ${token}` },
}
);
console.log(res.status);
import java.net.URI;
import java.net.http.*;
String baseUrl = "https://api.stonal.io/users";
String token = "<access_token>";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(baseUrl + "/v2/organizations/DEMO/users/5dbbc53c-1a22-4f6f-883c-74c04fe905f5/enable"))
.header("Authorization", "Bearer " + token)
.POST(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
package main
import (
"fmt"
"net/http"
)
func main() {
baseURL := "https://api.stonal.io/users"
token := "<access_token>"
req, _ := http.NewRequest("POST", baseURL+"/v2/organizations/DEMO/users/5dbbc53c-1a22-4f6f-883c-74c04fe905f5/enable", nil)
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println(resp.StatusCode)
}
using System.Net.Http;
using System.Net.Http.Headers;
var baseUrl = "https://api.stonal.io/users";
var token = "<access_token>";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var response = await client.PostAsync($"{baseUrl}/v2/organizations/DEMO/users/5dbbc53c-1a22-4f6f-883c-74c04fe905f5/enable", null);
Console.WriteLine((int)response.StatusCode);
Paramètres de chemin :
organizationCode: Votre code client (par ex. « DEMO »)uid: UID de l'utilisateur à réactiver (par ex. « 5dbbc53c-1a22-4f6f-883c-74c04fe905f5 »)
Réponses possibles :
- 204 : L'utilisateur a été réactivé avec succès
- 404 : L'utilisateur à réactiver n'existe pas
Supprimer un utilisateur
La suppression est définitive et irréversible. Pour révoquer l'accès de façon réversible, désactivez l'utilisateur à la place.
Voir : Spécification de l'API
DELETE /v2/organizations/DEMO/users/019619df-4768-76b7-81e3-2c56d374df46
- Python
- PHP
- JavaScript
- Java
- Go
- C#
import requests
BASE_URL = "https://api.stonal.io/users"
TOKEN = "<access_token>"
resp = requests.delete(
f"{BASE_URL}/v2/organizations/DEMO/users/019619df-4768-76b7-81e3-2c56d374df46",
headers={"Authorization": f"Bearer {TOKEN}"},
)
print(resp.status_code)
<?php
$baseUrl = "https://api.stonal.io/users";
$token = "<access_token>";
$ch = curl_init("$baseUrl/v2/organizations/DEMO/users/019619df-4768-76b7-81e3-2c56d374df46");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => ["Authorization: Bearer $token"],
]);
$response = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
curl_close($ch);
const baseUrl = "https://api.stonal.io/users";
const token = "<access_token>";
const res = await fetch(
`${baseUrl}/v2/organizations/DEMO/users/019619df-4768-76b7-81e3-2c56d374df46`,
{
method: "DELETE",
headers: { Authorization: `Bearer ${token}` },
}
);
console.log(res.status);
import java.net.URI;
import java.net.http.*;
String baseUrl = "https://api.stonal.io/users";
String token = "<access_token>";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(baseUrl + "/v2/organizations/DEMO/users/019619df-4768-76b7-81e3-2c56d374df46"))
.header("Authorization", "Bearer " + token)
.DELETE()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
package main
import (
"fmt"
"net/http"
)
func main() {
baseURL := "https://api.stonal.io/users"
token := "<access_token>"
req, _ := http.NewRequest("DELETE", baseURL+"/v2/organizations/DEMO/users/019619df-4768-76b7-81e3-2c56d374df46", nil)
req.Header.Set("Authorization", "Bearer "+token)
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println(resp.StatusCode)
}
using System.Net.Http;
using System.Net.Http.Headers;
var baseUrl = "https://api.stonal.io/users";
var token = "<access_token>";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var response = await client.DeleteAsync($"{baseUrl}/v2/organizations/DEMO/users/019619df-4768-76b7-81e3-2c56d374df46");
Console.WriteLine((int)response.StatusCode);
Paramètres de chemin :
organizationCode: Votre code client (par ex. « DEMO »)uid: UID de l'utilisateur à supprimer (par ex. « 019619df-4768-76b7-81e3-2c56d374df46 »)
Réponses possibles :
- 204 : L'utilisateur a été supprimé avec succès
- 404 : L'utilisateur à supprimer n'existe pas
- 409 : L'utilisateur ne peut pas être supprimé en raison d'un conflit (par exemple, une contrainte référentielle)
Notes
- Toutes les opérations sont limitées à une organisation et n'affectent l'accès qu'au sein de l'organisation indiquée dans le chemin de la requête.
- L'UID de l'utilisateur doit être obtenu via une recherche préalable ou stocké comme identifiant externe de votre côté.
- La désactivation et la réactivation sont idempotentes — désactiver un utilisateur déjà désactivé, ou réactiver un utilisateur déjà actif, réussit sans modifier l'état.
- La suppression est définitive et irréversible ; utilisez la désactivation lorsque vous pourriez avoir besoin de rétablir l'accès ultérieurement.
Gestion des erreurs
Les API Stonal renvoient une enveloppe d'erreur cohérente : { "type", "title", "detail" }. Les échecs de validation (422) remplacent detail par un tableau errors détaillant chaque champ.
| Statut | type | Signification |
|---|---|---|
400 | tag:InvalidBody / tag:InvalidContentType | Le corps de la requête ou le type de contenu est invalide |
401 | tag:Unauthenticated | Jeton d'authentification manquant ou expiré |
403 | tag:ForbiddenAccess | Le jeton n'a pas la permission d'accéder à cette ressource |
422 | tag:ValidationError | Un ou plusieurs champs ont échoué à la validation (voir errors[]) |
500 | tag:InternalError | Erreur serveur inattendue |
{
"type": "tag:ValidationError",
"title": "Invalid request",
"errors": [
{ "field": "email", "detail": "Email is required" }
]
}