Opérations sur les Utilisateurs du Locataire
Les points de terminaison des utilisateurs au sein d'un locataire gèrent les utilisateurs dans un locataire spécifique. Ces points de terminaison peuvent être accessibles avec une clé API Globale ou une clé API Locataire.
Authentification
| Type de clé API | Accès |
|---|---|
| Clé API Globale | Peut accéder à n'importe quel locataire |
| Clé API Locataire | Peut uniquement accéder à son propre locataire |
Lister les utilisateurs d’un locataire
GET /api/tenant/{tenantId}/user
Récupère les utilisateurs assignés à un locataire spécifique.
Paramètres de chemin
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
tenantId |
GUID | Oui | Identifiant du locataire |
Paramètres de requête
| Paramètre | Type | Défaut | Description |
|---|---|---|---|
page |
entier | 1 | Numéro de page pour la pagination |
pageSize |
entier | 50 | Nombre d’éléments par page (max : 1000) |
includeDisabled |
booléen | false | Inclure les utilisateurs désactivés |
role |
chaîne | null | Filtrer par nom de rôle |
search |
chaîne | null | Rechercher par email ou nom d’affichage |
Réponse (200 OK)
Même structure que la liste globale de tous les utilisateurs, mais filtrée pour le locataire spécifié.
Créer un utilisateur dans un locataire
POST /api/tenant/{tenantId}/user
Crée un nouvel utilisateur ET l’assigne au locataire, ou assigne un utilisateur existant au locataire.
Note : Si un utilisateur avec l’email spécifié existe déjà, il sera assigné au locataire au lieu de créer un doublon.
Paramètres de chemin
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
tenantId |
GUID | Oui | Identifiant du locataire |
Corps de la requête
{
"email": "john.smith@example.com",
"displayName": "John Smith",
"firstName": "John",
"lastName": "Smith",
"roleName": "Analyst"
}
Champs de la requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
email |
chaîne | Oui | Adresse email de l’utilisateur |
displayName |
chaîne | Oui | Nom d’affichage (2-100 caractères) |
firstName |
chaîne | Non | Prénom (max 50 caractères) |
lastName |
chaîne | Non | Nom de famille (max 50 caractères) |
roleName |
chaîne | Oui | Nom du rôle (voir Rôles & Permissions) |
Validation de capacité
L’opération vérifie les limites de capacité du locataire :
- La limite MaxUsers est vérifiée pour tous les rôles
- La limite MaxAnalyst est vérifiée pour les rôles Analyst
Réponse (201 Créé)
{
"userId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"email": "john.smith@example.com",
"displayName": "John Smith",
"message": "Utilisateur créé et assigné au locataire avec succès"
}
Réponses d’erreur
Conflit (409) :
{
"error": "L'utilisateur est déjà assigné à ce locataire"
}
Capacité dépassée (400) :
{
"error": "Impossible d'ajouter l'utilisateur : le locataire a atteint sa limite maximale d'utilisateurs (100)",
"hint": "Augmentez la limite d'utilisateurs ou d'analystes du locataire pour ajouter plus d'utilisateurs"
}
Obtenir un utilisateur dans un locataire
GET /api/tenant/{tenantId}/user/{userId}
Récupère un utilisateur spécifique dans le contexte du locataire.
Paramètres de chemin
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
tenantId |
GUID | Oui | Identifiant du locataire |
userId |
GUID | Oui | Identifiant de l'utilisateur |
Réponse (200 OK)
Retourne l’objet utilisateur s’il est assigné au locataire.
Obtenir un utilisateur par email dans un locataire
GET /api/tenant/{tenantId}/user/by-email/{email}
Récupère un utilisateur par email dans le contexte du locataire.
Paramètres de chemin
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
tenantId |
GUID | Oui | Identifiant du locataire |
email |
chaîne | Oui | Email de l'utilisateur (encodé URL) |
Réponse (200 OK)
Retourne l’objet utilisateur s’il est assigné au locataire.
Assigner un utilisateur existant à un locataire
POST /api/tenant/{tenantId}/user/{userId}
Assigne un utilisateur existant à un locataire.
Paramètres de chemin
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
tenantId |
GUID | Oui | Identifiant du locataire |
userId |
GUID | Oui | Identifiant de l'utilisateur |
Corps de la requête (optionnel)
{
"roleName": "Analyst"
}
Réponse (200 OK)
{
"message": "Utilisateur assigné au locataire avec succès"
}
Mettre à jour un utilisateur dans un locataire
PUT /api/tenant/{tenantId}/user/{userId}
Met à jour les propriétés d’un utilisateur dans le contexte du locataire.
Paramètres de chemin
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
tenantId |
GUID | Oui | Identifiant du locataire |
userId |
GUID | Oui | Identifiant de l'utilisateur |
Corps de la requête
{
"displayName": "Nom mis à jour",
"roleName": "TenantAdmin"
}
Réponse (200 OK)
{
"message": "Utilisateur mis à jour avec succès"
}
Supprimer un utilisateur d’un locataire
DELETE /api/tenant/{tenantId}/user/{userId}
Supprime l’assignation d’un utilisateur d’un locataire. Ceci NE supprime PAS l’utilisateur du système.
Paramètres de chemin
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
tenantId |
GUID | Oui | Identifiant du locataire |
userId |
GUID | Oui | Identifiant de l'utilisateur |
Réponse (200 OK)
{
"message": "Utilisateur retiré du locataire avec succès"
}
Réponses d’erreur
Non trouvé (404) :
{
"error": "L'utilisateur n'est pas assigné à ce locataire"
}
Exemples d’implémentation
cURL
# Lister les utilisateurs d'un locataire (la clé API locataire fonctionne)
curl -X GET "https://your-mindzie-instance.com/api/tenant/12345678-1234-1234-1234-123456789012/user" \
-H "Authorization: Bearer YOUR_TENANT_API_KEY"
# Rechercher des utilisateurs dans le locataire
curl -X GET "https://your-mindzie-instance.com/api/tenant/12345678-1234-1234-1234-123456789012/user?search=john" \
-H "Authorization: Bearer YOUR_TENANT_API_KEY"
# Créer un utilisateur dans le locataire (crée l'utilisateur ET l’assigne)
curl -X POST "https://your-mindzie-instance.com/api/tenant/12345678-1234-1234-1234-123456789012/user" \
-H "Authorization: Bearer YOUR_TENANT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "new.user@example.com",
"displayName": "New User",
"roleName": "Analyst"
}'
# Assigner un utilisateur existant au locataire
curl -X POST "https://your-mindzie-instance.com/api/tenant/12345678-1234-1234-1234-123456789012/user/a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
-H "Authorization: Bearer YOUR_TENANT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"roleName": "Analyst"}'
# Retirer un utilisateur du locataire
curl -X DELETE "https://your-mindzie-instance.com/api/tenant/12345678-1234-1234-1234-123456789012/user/a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
-H "Authorization: Bearer YOUR_TENANT_API_KEY"
Python
import requests
BASE_URL = 'https://your-mindzie-instance.com'
class TenantUserManager:
def __init__(self, api_key, tenant_id):
"""
Initialiser avec une clé API et un ID de locataire.
Fonctionne avec les clés API Globales ou Locataires.
"""
self.headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
}
self.tenant_id = tenant_id
def list_users(self, page=1, page_size=50, role=None, search=None):
"""Lister les utilisateurs assignés à ce locataire."""
url = f'{BASE_URL}/api/tenant/{self.tenant_id}/user'
params = {'page': page, 'pageSize': page_size}
if role:
params['role'] = role
if search:
params['search'] = search
response = requests.get(url, headers=self.headers, params=params)
response.raise_for_status()
return response.json()
def create_user(self, email, display_name, role_name,
first_name=None, last_name=None):
"""Créer un utilisateur et l’assigner au locataire (ou assigner un utilisateur existant)."""
url = f'{BASE_URL}/api/tenant/{self.tenant_id}/user'
payload = {
'email': email,
'displayName': display_name,
'roleName': role_name
}
if first_name:
payload['firstName'] = first_name
if last_name:
payload['lastName'] = last_name
response = requests.post(url, json=payload, headers=self.headers)
response.raise_for_status()
return response.json()
def assign_user(self, user_id, role_name=None):
"""Assigner un utilisateur existant à ce locataire."""
url = f'{BASE_URL}/api/tenant/{self.tenant_id}/user/{user_id}'
payload = {}
if role_name:
payload['roleName'] = role_name
response = requests.post(url, json=payload, headers=self.headers)
response.raise_for_status()
return response.json()
def remove_user(self, user_id):
"""Retirer un utilisateur de ce locataire (ne supprime pas l’utilisateur)."""
url = f'{BASE_URL}/api/tenant/{self.tenant_id}/user/{user_id}'
response = requests.delete(url, headers=self.headers)
response.raise_for_status()
return response.json()
def get_user(self, user_id):
"""Obtenir un utilisateur spécifique dans ce locataire."""
url = f'{BASE_URL}/api/tenant/{self.tenant_id}/user/{user_id}'
response = requests.get(url, headers=self.headers)
response.raise_for_status()
return response.json()
# Utilisation avec clé API Locataire
tenant_id = '12345678-1234-1234-1234-123456789012'
manager = TenantUserManager('your-tenant-api-key', tenant_id)
# Lister tous les analystes du locataire
analysts = manager.list_users(role='Analyst')
print(f"Le locataire a {analysts['totalCount']} analystes")
for user in analysts['users']:
print(f" - {user['displayName']} ({user['email']})")
# Ajouter un nouvel analyste
new_user = manager.create_user(
email='new.analyst@example.com',
display_name='New Analyst',
role_name='Analyst'
)
print(f"Utilisateur ajouté : {new_user['userId']}")
# Retirer l’utilisateur du locataire (il reste dans le système)
manager.remove_user(new_user['userId'])
print("Utilisateur retiré du locataire")
JavaScript/Node.js
const BASE_URL = 'https://your-mindzie-instance.com';
class TenantUserManager {
constructor(apiKey, tenantId) {
this.headers = {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
};
this.tenantId = tenantId;
}
async listUsers(options = {}) {
const params = new URLSearchParams({
page: options.page || 1,
pageSize: options.pageSize || 50
});
if (options.role) params.append('role', options.role);
if (options.search) params.append('search', options.search);
const url = `${BASE_URL}/api/tenant/${this.tenantId}/user?${params}`;
const response = await fetch(url, { headers: this.headers });
if (!response.ok) throw new Error(`Échec : ${response.status}`);
return await response.json();
}
async createUser(email, displayName, roleName) {
const url = `${BASE_URL}/api/tenant/${this.tenantId}/user`;
const response = await fetch(url, {
method: 'POST',
headers: this.headers,
body: JSON.stringify({ email, displayName, roleName })
});
if (!response.ok) throw new Error(`Échec : ${response.status}`);
return await response.json();
}
async assignUser(userId, roleName = null) {
const url = `${BASE_URL}/api/tenant/${this.tenantId}/user/${userId}`;
const body = roleName ? { roleName } : {};
const response = await fetch(url, {
method: 'POST',
headers: this.headers,
body: JSON.stringify(body)
});
if (!response.ok) throw new Error(`Échec : ${response.status}`);
return await response.json();
}
async removeUser(userId) {
const url = `${BASE_URL}/api/tenant/${this.tenantId}/user/${userId}`;
const response = await fetch(url, {
method: 'DELETE',
headers: this.headers
});
if (!response.ok) throw new Error(`Échec : ${response.status}`);
return await response.json();
}
}
// Utilisation
const tenantId = '12345678-1234-1234-1234-123456789012';
const manager = new TenantUserManager('your-tenant-api-key', tenantId);
// Lister les utilisateurs
const users = await manager.listUsers();
console.log(`Le locataire a ${users.totalCount} utilisateurs`);
// Ajouter un nouvel utilisateur
const newUser = await manager.createUser(
'new@example.com',
'Nouvel Utilisateur',
'Analyst'
);
console.log(`Ajouté : ${newUser.userId}`);
Bonnes pratiques
- Utiliser les clés API Locataires : Pour la plupart des opérations, les clés limitées au locataire sont plus sûres
- Vérifier la capacité : Contrôler les limites du locataire avant la création en masse d’utilisateurs
- Supprimer vs Retirer : Retirer d’un locataire conserve l’utilisateur dans le système pour d’autres locataires
- Rechercher avant de créer : Vérifier si l’utilisateur existe avant de créer pour éviter les doublons