Autenticación

Acceso seguro a mindzieAPI

Aprenda cómo autenticarse con mindzieAPI usando tokens Bearer, administrar el acceso a inquilinos y proyectos, e implementar patrones de integración segura de API.

Resumen de Autenticación

mindzieAPI utiliza autenticación con tokens Bearer combinada con identificadores de inquilino y proyecto para proporcionar acceso seguro y multi-inquilino a los recursos de mindzie.

Tipos de Claves API

mindzieAPI soporta dos tipos de claves API con diferentes niveles de acceso:

Claves API de Inquilino (Estándar)

Las claves API de inquilino están limitadas a un inquilino específico y se usan para la mayoría de las operaciones API:

  • Acceder a proyectos, conjuntos de datos, investigaciones y paneles dentro del inquilino
  • Ejecutar notebooks y bloques
  • Gestionar recursos a nivel de proyecto

Crear en: Configuración -> Claves API (dentro de mindzieStudio)

Claves API Globales (Claves API de Servidor)

Las claves API Globales tienen acceso administrativo a nivel del sistema y son necesarias para:

  • API de Inquilinos - Crear, listar, actualizar y eliminar inquilinos
  • API de Usuarios (Global) - Crear y administrar usuarios a través de todos los inquilinos
  • Asignar usuarios a inquilinos

Crear en: /admin/global-api-keys (requiere un rol administrativo: Desarrollador, Admin de TI, Administrador o Administrador de Servidor)

IMPORTANTE: Los endpoints de API de inquilinos (/api/tenant) requieren una Clave API Global. Las claves API específicas de inquilino no pueden acceder a estos endpoints y recibirán una respuesta 401 No Autorizado.

Encabezados Requeridos

Para Operaciones con Ámbito de Inquilino

Authorization: Bearer YOUR_TENANT_API_KEY
Content-Type: application/json

El ID del inquilino se incluye típicamente en la ruta de la URL (por ejemplo, /api/{tenantId}/project).

Para Operaciones Globales (Gestión de Inquilinos/Usuarios)

Authorization: Bearer YOUR_GLOBAL_API_KEY
Content-Type: application/json

Nota de Seguridad: Siempre use HTTPS al hacer solicitudes API para proteger sus tokens de acceso en tránsito.

Obtención de Tokens de Acceso

Servidor Empresarial

Para despliegues en Servidor Empresarial, contacte al administrador de mindzie para obtener:

  • Token de acceso API
  • ID del inquilino (formato GUID)
  • ID del proyecto (formato GUID)
  • URL base de la API para su instancia

Despliegue SaaS

Para usuarios SaaS, los tokens de acceso se pueden generar a través de:

  • La interfaz de usuario de mindzie Studio (Configuración → Claves API)
  • Contactando a su administrador de cuenta
  • Usando los endpoints de autenticación (si están habilitados)

Pruebas de Autenticación

Utilice los endpoints de ping para verificar su configuración de autenticación:

Prueba básica de conectividad

Este endpoint no requiere autenticación y es útil para verificar que el servidor esté accesible.

curl -X GET "https://your-mindzie-instance.com/api/{tenantId}/{projectId}/Action/unauthorized-ping"

Prueba autenticada

Este endpoint requiere un token Bearer válido y confirma que su token tiene acceso al inquilino y proyecto especificados.

curl -X GET "https://your-mindzie-instance.com/api/{tenantId}/{projectId}/Action/ping" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Respuesta Exitosa

{
  "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"]
}

Mejores Prácticas de Seguridad

Seguridad del Token

Almacene los tokens de forma segura usando variables de entorno o sistemas seguros de gestión de credenciales.

Expiración del Token

Monitoree la expiración del token e implemente mecanismos de renovación para mantener acceso ininterrumpido.

Multi-inquilino

Cada token está limitado a inquilinos y proyectos específicos para garantizar aislamiento seguro de datos.

Ejemplos de Implementación

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}")

# Uso
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);
    }
}

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

Manejo de Errores

Errores Comunes de Autenticación

Código de Estado Error Descripción Solución
401 No autorizado Token de acceso inválido o faltante Verifique el token y asegúrese que no esté expirado
403 Prohibido Token válido pero permisos insuficientes Revise acceso a inquilino/proyecto o solicite permisos
400 Solicitud incorrecta Encabezados requeridos faltantes Asegúrese que X-Tenant-Id y X-Project-Id estén provistos

Ejemplo de Respuesta de Error

{
  "error": "invalid_token",
  "message": "El token de acceso proporcionado es inválido o ha expirado",
  "timestamp": "2024-01-15T10:30:00Z",
  "requestId": "req_12345"
}

Próximos Pasos

Una vez que la autenticación funcione, pruebe la Guía de Inicio Rápido para hacer sus primeras llamadas a la API o explore la documentación de Formatos de Respuesta.