Artigo
Estrutura de Autenticação SeguraEstrutura de Autenticação Segura
Fabrício de Medeiros
🛡️ Estrutura de Autenticação Segura
Serviços Separados para Web e API
Documento Técnico - Arquitetura MVC PHP 8.2+
📘 Visão Geral
Este documento tem como objetivo padronizar, documentar e orientar a implementação dos serviços de autenticação utilizados no projeto, respeitando o padrão arquitetural MVC, com divisão clara entre autenticação para interface Web (baseada em sessões) e autenticação para API (baseada em JWT).
Optamos por separar os serviços de autenticação para garantir clareza, modularidade e facilidade de manutenção, evitando mistura de responsabilidades.
🗂️ Estrutura de Arquivos
App/
├── src/
│ ├── Controller/
│ │ ├── AuthController.php # Requisições de login Web
│ │ └── AuthApiController.php # Requisições da API (JSON)
│ ├── Service/
│ │ ├── AuthService.php # Autenticação Web (sessões)
│ │ └── AuthApiService.php # Autenticação API (JWT)
│ └── Model/
│ └── User.php # Representa o usuário, contém getByEmail()
📦 Descrição dos Componentes
🔹 AuthService.php (Autenticação Web)
namespace App\Service;
class AuthService
{
public function login(string $email, string $password): bool;
public function logout(): void;
public function isAuthenticated(): bool;
private function verifyPassword(string $hash, string $plain): bool;
}
Função: Realiza login tradicional com sessões, ideal para navegadores.
- Armazena o ID do usuário autenticado via
$_SESSION
. - Sanitiza entrada antes de consultar o banco.
- Encapsula verificação com
password_verify()
.
🔹 AuthApiService.php (Autenticação API)
namespace App\Service;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
class AuthApiService
{
public function login(string $email, string $password): ?string;
public function verifyToken(string $token): ?array;
private function generateToken(array $payload): string;
private function verifyPassword(string $hash, string $plain): bool;
}
Função: Autentica via JWT, retornando token para requisições protegidas da API.
- Geração segura de token com
HS256
. - Payload inclui expiração (
exp
). - Modularização permite troca de algoritmo.
🔄 Diferença de Fluxos
Item | Web (AuthService) | API (AuthApiService) |
---|---|---|
Armazenamento | Sessão ($_SESSION ) |
Token JWT |
Persistência | Servidor | Cliente (Header: Authorization) |
Resposta | Redirecionamento | JSON com status e token |
Logout | session_destroy() |
Remoção do token no client |
✅ Boas Práticas de Nomenclatura
- Prefixos como
login
,logout
,verifyToken
tornam o serviço autoexplicativo. - Evite misturar autenticação com persistência — use
User.php
ou umUserRepository
. - Mantenha métodos privados como
verifyPassword()
egenerateToken()
encapsulados.
🔐 Segurança Adicional
- Use
password_hash()
combcrypt
ouargon2id
. - Tokens JWT devem conter:
iat
,exp
,iss
,sub
. - Armazene o segredo JWT em variáveis de ambiente no ambiente de produção.
- Proteja rotas de API com middleware para validar o token e extrair o ID do usuário.
🧪 Exemplo de uso em AuthApiController.php
namespace App\Controller;
use App\Service\AuthApiService;
class AuthApiController
{
public function login(): void
{
$data = json_decode(file_get_contents('php://input'), true);
$authService = new AuthApiService();
$token = $authService->login($data['email'], $data['password']);
if (!$token) {
http_response_code(401);
echo json_encode(['error' => 'Credenciais inválidas']);
return;
}
echo json_encode(['token' => $token]);
}
}
🧭 Caminhos para evolução futura
- Adicionar refresh token com tempo maior.
- Implementar bloqueio após X tentativas falhas.
- Registrar logins com IP, hora e user-agent.
- Unificar serviços com uma
AuthInterface
.
📚 Referências e Fontes
Explore, Contribua e Cresça Conosco!
Obrigado por ler o nosso artigo! Esperamos que você tenha encontrado informações valiosas e inspiradoras. Se você está empolgado para saber mais, temos uma vasta coleção de artigos sobre tópicos variados, desde tendências tecnológicas até insights sobre desenvolvimento de software. Não deixe de explorar nossas outras publicações!
Quer fazer parte da nossa comunidade?
Inscreva-se no nosso site para receber as últimas atualizações e novidades diretamente no seu e-mail. Seu cadastro é o primeiro passo para se conectar com uma rede de entusiastas e profissionais apaixonados pelo que fazem.
Tem algo a compartilhar?
Adoraríamos ouvir suas ideias, inovações e experiências! Sinta-se à vontade para escrever e enviar seus próprios artigos, códigos ou projetos. Sua contribuição é fundamental para enriquecer nosso conteúdo e ajudar outros leitores a crescer junto com você. Juntos, podemos criar um espaço de aprendizado e troca de conhecimento enriquecedor. Seu conhecimento e entusiasmo são o que fazem nossa comunidade especial.
Inscreva-se Agora | Compartilhe | Contribua com um Artigo
Continue explorando e seja parte da transformação!