Authentification

Accès sécurisé à mindzieAPI

Découvrez comment vous authentifier avec mindzieAPI en utilisant des jetons Bearer, gérer l'accès aux locataires et aux projets, et mettre en œuvre des modèles d'intégration API sécurisés.

Vue d'ensemble de l'authentification

mindzieAPI utilise une authentification par jeton Bearer combinée à des identifiants de locataire et de projet pour fournir un accès sécurisé multi-locataires aux ressources mindzie.

Types de clés API

mindzieAPI prend en charge deux types de clés API avec différents niveaux d'accès :

Clés API Locataire (Standard)

Les clés API Locataire sont limitées à un locataire spécifique et sont utilisées pour la plupart des opérations API :

  • Accéder aux projets, ensembles de données, enquêtes et tableaux de bord au sein du locataire
  • Exécuter des notebooks et des blocs
  • Gérer les ressources au niveau du projet

Création dans : Paramètres -> Clés API (dans mindzieStudio)

Clés API Globales (Clés API Serveur)

Les clés API Globales disposent d'un accès administratif à l'échelle du système et sont requises pour :

  • API Locataire - Créer, lister, mettre à jour et supprimer des locataires
  • API Utilisateur (Global) - Créer et gérer les utilisateurs sur tous les locataires
  • Assigner des utilisateurs aux locataires

Création dans : /admin/global-api-keys (accès Administrateur requis)

IMPORTANT : Les points d'extrémité Tenant API (/api/tenant) nécessitent une clé API Globale. Les clés API spécifiques au locataire ne peuvent pas accéder à ces endpoints et recevront une réponse 401 Non autorisé.

En-têtes requis

Pour les opérations limitées au locataire

Authorization: Bearer YOUR_TENANT_API_KEY
Content-Type: application/json

L'identifiant du locataire est généralement inclus dans le chemin de l'URL (par exemple, /api/{tenantId}/project).

Pour les opérations globales (gestion des locataires/utilisateurs)

Authorization: Bearer YOUR_GLOBAL_API_KEY
Content-Type: application/json

Note de sécurité : Utilisez toujours HTTPS lors des requêtes API pour protéger vos jetons d'accès en transit.

Obtention des jetons d'accès

Serveur Entreprise

Pour les déploiements Serveur Entreprise, contactez votre administrateur mindzie pour obtenir :

  • Jeton d'accès API
  • Identifiant du locataire (format GUID)
  • Identifiant du projet (format GUID)
  • URL de base de l'API pour votre instance

Déploiement SaaS

Pour les utilisateurs SaaS, les jetons d'accès peuvent être générés via :

  • L'interface utilisateur mindzie Studio (Paramètres → Clés API)
  • Le contact avec votre administrateur de compte
  • L'utilisation des points d'extrémité d'authentification (si activés)

Tester l'authentification

Utilisez les endpoints ping pour vérifier la configuration de votre authentification :

Test de connectivité basique

curl -X GET "https://your-mindzie-instance.com/api/Action/ping"

Test authentifié

curl -X GET "https://your-mindzie-instance.com/api/Action/ping/authenticated" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "X-Tenant-Id: YOUR_TENANT_GUID" \
  -H "X-Project-Id: YOUR_PROJECT_GUID"

Réponse réussie

{
  "status": "authenticated",
  "timestamp": "2024-01-15T10:30:00Z",
  "tenantId": "12345678-1234-1234-1234-123456789012",
  "projectId": "87654321-4321-4321-4321-210987654321",
  "userId": "user@company.com",
  "permissions": ["read", "write", "admin"]
}

Bonnes pratiques de sécurité

Sécurité des jetons

Stockez les jetons de manière sécurisée en utilisant des variables d'environnement ou des systèmes sécurisés de gestion des identifiants.

Expiration des jetons

Surveillez l'expiration des jetons et implémentez des mécanismes de rafraîchissement pour maintenir un accès ininterrompu.

Multi-locataires

Chaque jeton est limité à des locataires et projets spécifiques pour garantir l'isolation sécurisée des données.

Exemples d'implémentation

JavaScript/Node.js

const apiConfig = {
  baseURL: process.env.MINDZIE_API_URL,
  token: process.env.MINDZIE_ACCESS_TOKEN,
  tenantId: process.env.MINDZIE_TENANT_ID,
  projectId: process.env.MINDZIE_PROJECT_ID
};

const makeAuthenticatedRequest = async (endpoint, options = {}) => {
  const url = `${apiConfig.baseURL}${endpoint}`;
  const headers = {
    'Authorization': `Bearer ${apiConfig.token}`,
    'X-Tenant-Id': apiConfig.tenantId,
    'X-Project-Id': apiConfig.projectId,
    'Content-Type': 'application/json',
    ...options.headers
  };

  try {
    const response = await fetch(url, {
      ...options,
      headers
    });

    if (!response.ok) {
      throw new Error(`API request failed: ${response.status} ${response.statusText}`);
    }

    return await response.json();
  } catch (error) {
    console.error('API request error:', error);
    throw error;
  }
};

Python

import os
import requests
from typing import Dict, Any

class MindzieAPIClient:
    def __init__(self):
        self.base_url = os.getenv('MINDZIE_API_URL')
        self.token = os.getenv('MINDZIE_ACCESS_TOKEN')
        self.tenant_id = os.getenv('MINDZIE_TENANT_ID')
        self.project_id = os.getenv('MINDZIE_PROJECT_ID')

        if not all([self.base_url, self.token, self.tenant_id, self.project_id]):
            raise ValueError("Missing required environment variables")

    def _get_headers(self) -> Dict[str, str]:
        return {
            'Authorization': f'Bearer {self.token}',
            'X-Tenant-Id': self.tenant_id,
            'X-Project-Id': self.project_id,
            'Content-Type': 'application/json'
        }

    def make_request(self, method: str, endpoint: str, **kwargs) -> Dict[str, Any]:
        url = f"{self.base_url.rstrip('/')}{endpoint}"
        headers = self._get_headers()

        if 'headers' in kwargs:
            headers.update(kwargs['headers'])

        kwargs['headers'] = headers

        try:
            response = requests.request(method, url, **kwargs)
            response.raise_for_status()
            return response.json()
        except requests.exceptions.RequestException as e:
            raise Exception(f"API request failed: {e}")

# Utilisation
client = MindzieAPIClient()
result = client.make_request('GET', '/api/Action/ping/authenticated')

C#/.NET

using System;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;

public class MindzieApiClient
{
    private readonly HttpClient _httpClient;
    private readonly string _baseUrl;
    private readonly string _tenantId;
    private readonly string _projectId;

    public MindzieApiClient(string baseUrl, string accessToken, string tenantId, string projectId)
    {
        _baseUrl = baseUrl.TrimEnd('/');
        _tenantId = tenantId;
        _projectId = projectId;

        _httpClient = new HttpClient();
        _httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {accessToken}");
        _httpClient.DefaultRequestHeaders.Add("X-Tenant-Id", tenantId);
        _httpClient.DefaultRequestHeaders.Add("X-Project-Id", projectId);
    }

    public async Task<T> GetAsync<T>(string endpoint)
    {
        var response = await _httpClient.GetAsync($"{_baseUrl}{endpoint}");
        response.EnsureSuccessStatusCode();

        var content = await response.Content.ReadAsStringAsync();
        return JsonSerializer.Deserialize<T>(content);
    }

    public async Task<T> PostAsync<T>(string endpoint, object data)
    {
        var json = JsonSerializer.Serialize(data);
        var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

        var response = await _httpClient.PostAsync($"{_baseUrl}{endpoint}", content);
        response.EnsureSuccessStatusCode();

        var responseContent = await response.Content.ReadAsStringAsync();
        return JsonSerializer.Deserialize<T>(responseContent);
    }
}

// Utilisation
var client = new MindzieApiClient(
    Environment.GetEnvironmentVariable("MINDZIE_API_URL"),
    Environment.GetEnvironmentVariable("MINDZIE_ACCESS_TOKEN"),
    Environment.GetEnvironmentVariable("MINDZIE_TENANT_ID"),
    Environment.GetEnvironmentVariable("MINDZIE_PROJECT_ID")
);

Gestion des erreurs

Erreurs courantes d’authentification

Code statut Erreur Description Solution
401 Non autorisé Jeton d'accès invalide ou manquant Vérifiez le jeton et assurez-vous qu'il n'est pas expiré
403 Interdit Jeton valide mais permissions insuffisantes Vérifiez l'accès au locataire/projet ou demandez les permissions
400 Requête incorrecte En-têtes requis manquants Assurez-vous que X-Tenant-Id et X-Project-Id sont fournis

Exemple de réponse d’erreur

{
  "error": "invalid_token",
  "message": "Le jeton d'accès fourni est invalide ou expiré",
  "timestamp": "2024-01-15T10:30:00Z",
  "requestId": "req_12345"
}

Étapes suivantes

Une fois l'authentification opérationnelle, essayez le Guide de démarrage rapide pour effectuer vos premières appels API ou explorez la documentation des Formats de réponse.