Suas ideias em realidade digital!
Em APIs REST feitas em PHP, os erros 401 Unauthorized e 403 Forbidden são extremamente comuns — e também extremamente mal utilizados.
Apesar de parecidos, eles têm significados completamente diferentes. Usar o código errado prejudica:
| Status | Significado | Quando usar |
|---|---|---|
| 401 | Não autenticado | Token ausente, inválido ou expirado |
| 403 | Autenticado, mas sem permissão | Usuário existe, mas não pode acessar |
O erro 401 indica que a requisição não possui credenciais válidas.
Authorization não enviado<?php
if (empty($_SERVER['HTTP_AUTHORIZATION'])) {
http_response_code(401);
echo json_encode(['error' => 'Token não informado']);
exit;
}
<?php
$auth = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
if (!preg_match('/Bearer\s+(.*)$/i', $auth, $matches)) {
http_response_code(401);
echo json_encode(['error' => 'Token inválido']);
exit;
}
$token = trim($matches[1]);
// validar token no banco ou JWT
---
O erro 403 significa que o usuário está autenticado, mas não tem permissão para acessar aquele recurso.
<?php
if ($user['role'] !== 'admin') {
http_response_code(403);
echo json_encode(['error' => 'Acesso negado']);
exit;
}
---
Siga sempre esta ordem:
<?php
// 1) Autenticação
$user = Auth::validateToken(); // lança 401 se falhar
// 2) Autorização
if (!$user['can_edit']) {
Response::error('Forbidden', 403);
}
// 3) Executa ação
---
Se sua API usa CORS, o navegador envia uma requisição OPTIONS.
Se você retornar 401 ou 403 no OPTIONS, o front quebra.
<?php
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit;
}
---