Documentación de Integración API
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.
Gestiona tus clientes OAuth desde la interfaz web. Ya no necesitas seeders ni comandos.
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.
Los tokens OAuth2 ahora se generan correctamente con expiración válida (6 meses). Ya no hay problemas de tokens vencidos.
Tu app redirige al usuario
A /oauth/authorize con client_id y redirect_uri
Usuario inicia sesión y autoriza
En nuestro servidor (con 2FA si está activo)
Redirect con código
Tu app recibe el código de autorización (válido 1 minuto)
Intercambio por token
Tu servidor intercambia el código por access_token
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.
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
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
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.
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
}
}
}
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"
}
}
| Scope | Descripción |
|---|---|
| * | Acceso completo (por defecto) |
| read | Ver información de perfil |
| write | Modificar información |
| profile | Acceso a perfil de usuario |
| Ver dirección de email | |
| sessions | Gestionar sesiones activas |
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"
}
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"
}
Cierra sesión y revoca el token actual.
Body (JSON):
{
"temp_token": "temp_abc123",
"code": "123456"
}
Body (JSON):
{
"method": "email" // o "sms"
}
// 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
// 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);
}
?>
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ó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 |
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.
El client_id no existe o está deshabilitado.
Solución: Verifica que estés usando el client_id correcto proporcionado por el administrador.
Este problema fue corregido en la última actualización.
Estado: ✅ Solucionado - Los tokens ahora tienen expiración válida de 6 meses.
Este problema fue causado por tokens con expiración incorrecta.
Estado: ✅ Solucionado - Los tokens ahora son válidos y funcionan correctamente.
Si encuentras algún problema no listado aquí, contacta al equipo de desarrollo con:
Revisa el archivo README_AUTH_API.md o contacta al equipo de desarrollo