Site

Autenticação via API

v4

Bearer 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 cache
Authorization: Bearer mcrm_a1b2c3d4e5f6...
Accept: application/json

request()->user()

$customer = request()->user();          // Bearer (API)
$customer = request()->user('user');    // sessão web
$admin = request()->user('admin');      // sessão admin

Em 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.