Autenticação via API
v4Bearer Token com hash SHA-256 no banco, abilities, TTL configurável e cache de validação. Sessões web (user / admin) continuam separadas — a API é um caminho paralelo.
ℹ️Não é JWT
O token é opaco (
mcrm_...). No banco fica só o SHA-256. Validação por hash + cache + abilities.Fluxo do token
1. POST /api/login { email, password }
2. Core cria token name=login (revoga o login anterior deste customer)
3. Resposta: { success: true, token: "mcrm_..." }
4. Cliente guarda o token
5. Próximas requests: Authorization: Bearer mcrm_...
6. Middleware auth:api → hash → cache api_tokens → (miss) banco
7. POST /api/logout → revoga name=login + limpa cacheAuthorization: Bearer mcrm_a1b2c3d4e5f6...
Accept: application/jsonrequest()->user()
$customer = request()->user(); // Bearer (API)
$customer = request()->user('user'); // sessão web
$admin = request()->user('admin'); // sessão adminEm rotas API, request()->user() não faz fallback para sessão web.
$token = request()->bearer_token();
$api_key = request()->header('X-API-KEY');Token de serviço
Para apps, bots, cron — token que você define em config e valida com bearer_token():
$my_token = config('api.service_token');
uri::group(['prefix' => 'api', 'without_csrf' => true], function () {
uri::get('/status', [status_handler::class, 'show']);
});
public function show()
{
$token = request()->bearer_token();
$my_token = config('api.service_token');
if (!$token || !hash_equals((string) $my_token, (string) $token)) {
return json(['success' => false, 'error' => 'Token inválido.'], 401);
}
return json(['success' => true, 'online' => true, 'version' => config('app.version')]);
}⚠️Não misture com auth:api
Token de serviço não passa pelo middleware
auth:api. Valide com hash_equals.No servidor (PHP)
use MUCRM\engine\auth\concerns\has_api_tokens;
class customer extends schema
{
use has_api_tokens;
}
$token = $customer->create_login_token(['*'])->plainTextToken;
request()->user()->logout();uri::group(['prefix' => 'api', 'without_csrf' => true], function () {
uri::post('/login', [auth_handler::class, 'login']);
uri::group(['middleware' => ['auth:api']], function () {
uri::post('/me', [auth_handler::class, 'me']);
uri::post('/logout', [auth_handler::class, 'logout']);
});
});Respostas
// Sucesso
{ "success": true, "token": "mcrm_..." }
// Erro
{ "success": false, "code": 401, "error": "Credenciais inválidas." }Próximo: Tokens & Abilities ·Rate Limiting ·Envelope JSON.