🔐 Auth EME10

Documentación de Integración API

Servidor: https://www.auth.eme10.com

🚀 Inicio Rápido

Configuración Base

URL Base de la API:

https://www.auth.eme10.com/api

Headers requeridos:

{
  "Content-Type": "application/json",
  "Accept": "application/json",
  "Authorization": "Bearer {token}" // Para endpoints protegidos
}

💡 Importante: Todos los endpoints devuelven respuestas en formato JSON.

🔐 OAuth2 - Login Centralizado

⚙️ Panel de Configuración Web

Gestiona tus clientes OAuth desde la interfaz web. Ya no necesitas seeders ni comandos.

  • ✅ Crear y editar clientes OAuth
  • ✅ Agregar/eliminar URLs de redirección permitidas
  • ✅ Obtener Client ID y Secret
  • ✅ Regenerar secrets por seguridad

✨ Flujo OAuth2 Estándar

Integra tu app usando el estándar OAuth2 con login centralizado. El usuario inicia sesión en nuestro servidor y tu app recibe el token automáticamente.

✅ Login centralizado ✅ 2FA automático ✅ Estándar OAuth2 ✅ Más seguro ✅ Tokens válidos

🎉 Actualización: Tokens Corregidos

Los tokens OAuth2 ahora se generan correctamente con expiración válida (6 meses). Ya no hay problemas de tokens vencidos.

✅ expires_in positivo ✅ Sin errores 401 ✅ Perfil real del usuario

Flujo de Autorización (Authorization Code Grant)

1

Tu app redirige al usuario

A /oauth/authorize con client_id y redirect_uri

2

Usuario inicia sesión y autoriza

En nuestro servidor (con 2FA si está activo)

3

Redirect con código

Tu app recibe el código de autorización (válido 1 minuto)

4

Intercambio por token

Tu servidor intercambia el código por access_token

5

Obtener perfil y registrar sesión

GET /api/auth/profile + POST /api/app-sessions/register

💡 Ventaja: Authorization Code Grant es más seguro que Implicit Grant. El access_token nunca se expone en el navegador.

1. Endpoint de Autorización

GET https://www.auth.eme10.com/oauth/authorize

Redirige al usuario aquí para iniciar el flujo OAuth2 (Authorization Code Grant).

Parámetros de URL:

client_id=4                                    // ID de tu cliente OAuth
redirect_uri=https://miapp.com/callback       // URL de callback (debe estar registrada)
response_type=code                             // Siempre "code" para Authorization Code Grant
scope=                                         // Vacío o permisos solicitados
state=random_string_xyz                        // Token CSRF (recomendado)

Ejemplo de URL completa:

https://www.auth.eme10.com/oauth/authorize?client_id=4&redirect_uri=https://miapp.com/callback&response_type=code&state=xyz123

2. Callback con Código de Autorización

Después de autorizar, el usuario será redirigido con un código temporal en los query parameters.

URL de callback que recibirás:

https://miapp.com/callback?code=def50200a3f2b...&state=xyz123

3. Intercambiar Código por Access Token

POST https://www.auth.eme10.com/oauth/token

Tu servidor debe intercambiar el código temporal por un access token permanente.

Body (form-data):

{
  "grant_type": "authorization_code",
  "client_id": "4",
  "redirect_uri": "https://miapp.com/callback",
  "code": "def50200a3f2b..."
}

Respuesta exitosa:

{
  "token_type": "Bearer",
  "expires_in": 15724800,
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
  "refresh_token": "def50200..."
}

💡 Importante: El código es de un solo uso y expira en 1 minuto. Debe ser intercambiado inmediatamente por tu servidor backend.

4. Obtener Perfil del Usuario

GET https://www.auth.eme10.com/api/auth/profile 🔒 Requiere autenticación

Headers:

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
Accept: application/json

Respuesta:

{
  "success": true,
  "data": {
    "user": {
      "id": 1,
      "name": "DANIEL MONTILLA",
      "email": "montilla.colombia@gmail.com",
      "phone": "+573113230341",
      "avatar": null,
      "is_active": true
    }
  }
}

5. Registrar Sesión de App

POST https://www.auth.eme10.com/api/app-sessions/register 🔒 Requiere autenticación

Registra que el usuario inició sesión en tu aplicación.

Body (JSON):

{
  "app_name": "Creador de Sitios Web",
  "ip_address": "186.154.37.217",
  "user_agent": "Mozilla/5.0..."
}

Respuesta:

{
  "success": true,
  "message": "Sesión de app registrada",
  "data": {
    "id": 1,
    "user_id": 1,
    "app_name": "Creador de Sitios Web",
    "is_active": true,
    "created_at": "2025-10-13T08:31:58.000000Z"
  }
}

Scopes Disponibles

Scope Descripción
* Acceso completo (por defecto)
read Ver información de perfil
write Modificar información
profile Acceso a perfil de usuario
email Ver dirección de email
sessions Gestionar sesiones activas

🔑 Autenticación

Login

POST https://www.auth.eme10.com/api/auth/login

Inicia sesión con email/teléfono y contraseña.

Body (JSON):

{
  "login": "usuario@ejemplo.com",  // o número de teléfono
  "password": "password123"
}

Respuesta exitosa (sin 2FA):

{
  "success": true,
  "message": "Login exitoso",
  "data": {
    "user": {
      "id": 1,
      "name": "Juan Pérez",
      "email": "usuario@ejemplo.com",
      "phone": "+521234567890",
      "avatar": "/avatars/avatar_1.jpg",
      "is_active": true,
      "two_factor_enabled": false
    },
    "token": "1|xxxxxxxxxxxxx",
    "roles": ["user"],
    "permissions": ["view-profile", "edit-profile"]
  }
}

Respuesta con 2FA activado:

{
  "success": true,
  "requires_two_factor": true,
  "message": "Código de verificación enviado",
  "sent_to": "usuario@ejemplo.com",
  "method": "email",
  "temp_token": "temp_abc123"
}

Registro

POST https://www.auth.eme10.com/api/auth/register

Body (JSON):

{
  "name": "Juan Pérez",
  "email": "nuevo@ejemplo.com",      // email o phone requerido
  "phone": "+521234567890",          // opcional si hay email
  "password": "password123",
  "password_confirmation": "password123"
}

Logout

POST https://www.auth.eme10.com/api/auth/logout 🔒 Requiere autenticación

Cierra sesión y revoca el token actual.

🔐 Autenticación de Dos Factores (2FA)

Verificar Código 2FA

POST https://www.auth.eme10.com/api/two-factor/verify

Body (JSON):

{
  "temp_token": "temp_abc123",
  "code": "123456"
}

Activar 2FA

POST https://www.auth.eme10.com/api/two-factor/enable 🔒 Requiere autenticación

Body (JSON):

{
  "method": "email"  // o "sms"
}

Desactivar 2FA

POST https://www.auth.eme10.com/api/two-factor/disable 🔒 Requiere autenticación

💻 Ejemplos de Integración

JavaScript (Fetch API)

// Login
async function login(email, password) {
  const response = await fetch('https://www.auth.eme10.com/api/auth/login', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json'
    },
    body: JSON.stringify({ login: email, password })
  });
  
  const data = await response.json();
  
  if (data.success) {
    if (data.requires_two_factor) {
      // Mostrar formulario 2FA
      showTwoFactorForm(data.temp_token);
    } else {
      // Guardar token
      localStorage.setItem('auth_token', data.data.token);
      console.log('Usuario:', data.data.user);
    }
  }
}

// Hacer request autenticado
async function getProfile() {
  const token = localStorage.getItem('auth_token');
  
  const response = await fetch('https://www.auth.eme10.com/api/user', {
    headers: {
      'Authorization': `Bearer ${token}`,
      'Accept': 'application/json'
    }
  });
  
  const data = await response.json();
  return data;
}

PHP (cURL)

<?php
// Login
function login($email, $password) {
    $ch = curl_init('https://www.auth.eme10.com/api/auth/login');
    
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json',
            'Accept: application/json'
        ],
        CURLOPT_POSTFIELDS => json_encode([
            'login' => $email,
            'password' => $password
        ])
    ]);
    
    $response = curl_exec($ch);
    curl_close($ch);
    
    return json_decode($response, true);
}

// Request autenticado
function getProfile($token) {
    $ch = curl_init('https://www.auth.eme10.com/api/user');
    
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            "Authorization: Bearer {$token}",
            'Accept: application/json'
        ]
    ]);
    
    $response = curl_exec($ch);
    curl_close($ch);
    
    return json_decode($response, true);
}
?>

Python (Requests)

import requests

# Login
def login(email, password):
    response = requests.post(
        'https://www.auth.eme10.com/api/auth/login',
        json={'login': email, 'password': password},
        headers={
            'Content-Type': 'application/json',
            'Accept': 'application/json'
        }
    )
    return response.json()

# Request autenticado
def get_profile(token):
    response = requests.get(
        'https://www.auth.eme10.com/api/user',
        headers={
            'Authorization': f'Bearer {token}',
            'Accept': 'application/json'
        }
    )
    return response.json()

📋 Códigos de Respuesta HTTP

Código Significado
200 Éxito
201 Creado exitosamente
400 Solicitud incorrecta
401 No autenticado
403 No autorizado
422 Error de validación
500 Error del servidor

🔧 Solución de Problemas OAuth2

Problemas Comunes

❌ Error: "Redirect URI no autorizado"

La URL de callback no está registrada en la whitelist.

Solución: Contacta al administrador para agregar tu URL de callback a la lista de URIs permitidas.

⚠️ Error: "Cliente OAuth no válido"

El client_id no existe o está deshabilitado.

Solución: Verifica que estés usando el client_id correcto proporcionado por el administrador.

ℹ️ Token con expires_in negativo

Este problema fue corregido en la última actualización.

Estado: ✅ Solucionado - Los tokens ahora tienen expiración válida de 6 meses.

✅ Error 401 "Unauthenticated"

Este problema fue causado por tokens con expiración incorrecta.

Estado: ✅ Solucionado - Los tokens ahora son válidos y funcionan correctamente.

📞 ¿Necesitas ayuda?

Si encuentras algún problema no listado aquí, contacta al equipo de desarrollo con:

  • • URL de error completa
  • • Mensaje de error exacto
  • • Pasos para reproducir el problema
  • • client_id que estás usando

¿Necesitas ayuda?

Revisa el archivo README_AUTH_API.md o contacta al equipo de desarrollo