CodeIgniter 4: criar um sistema de autenticação baseado em tokens JWT
Guia completo para implementar autenticação stateless com JSON Web Token no CodeIgniter 4 e proteger APIs RESTful.
Em APIs RESTful modernas e aplicações desacopladas, como SPAs em React ou Vue e aplicativos móveis, a autenticação tradicional baseada em sessão nem sempre é a melhor opção. Os JSON Web Tokens (JWT) são uma solução padrão para autenticação stateless, segura e escalável.
Por que usar JWT com CodeIgniter 4
A integração de JWT ao CodeIgniter 4 oferece diversas vantagens arquitetônicas:
- Stateless: o servidor não precisa armazenar o estado da sessão no banco de dados ou cache para cada requisição.
- Filtros nativos: os Filters do CodeIgniter 4 podem interceptar e validar o cabeçalho de autorização antes da execução dos controladores.
- Flexibilidade: o token contém a carga útil assinada necessária para identificar o usuário e suas funções.
1. Configurar a chave secreta e as dependências
Primeiro, instalamos a biblioteca JWT padrão por meio do Composer:
composer require firebase/php-jwt
Depois, definimos uma chave secreta forte no arquivo .env do projeto para assinar os tokens:
JWT_SECRET_KEY = 'la_tua_chiave_segreta_molto_lunga_e_sicura'
JWT_TIME_TO_LIVE = 3600
2. Gerar o token no login
No controlador de autenticação, por exemplo AuthController.php, validamos as credenciais e, se estiverem corretas, geramos um JWT retornado como JSON:
request->getVar('email');
$password = $this->request->getVar('password');
$userModel = new \App\Models\UserModel();
$user = $userModel->where('email', $email)->first();
if (!$user || !password_verify($password, $user['password'])) {
return $this->failUnauthorized('Credenziali non valide');
}
$key = getenv('JWT_SECRET_KEY');
$iat = time();
$exp = $iat + (int)getenv('JWT_TIME_TO_LIVE');
$payload = [
'iss' => 'athesis_api',
'sub' => $user['id'],
'iat' => $iat,
'exp' => $exp,
'email'=> $user['email']
];
$token = JWT::encode($payload, $key, 'HS256');
return $this->respond([
'status' => 200,
'message' => 'Login effettuato con successo',
'token' => $token,
'expires' => $exp
]);
}
}
3. Proteger rotas com um filtro JWT
Para validar o token em cada requisição protegida, criamos um filtro em App/Filters/JWTAuthFilter.php:
getHeaderLine('Authorization');
$token = null;
if (!empty($header) && preg_match('/Bearer\s(\S+)/', $header, $matches)) {
$token = $matches[1];
}
if (!$token) {
return service('response')
->setStatusCode(401)
->setJSON(['message' => 'Token di accesso mancante o non valido']);
}
try {
$key = getenv('JWT_SECRET_KEY');
$decoded = JWT::decode($token, new Key($key, 'HS256'));
} catch (Exception $e) {
return service('response')
->setStatusCode(401)
->setJSON(['message' => 'Token scaduto o non autorizzato: ' . $e->getMessage()]);
}
}
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
{
}
}
Conclusão
JWT permite estruturar no CodeIgniter 4 uma arquitetura de API limpa e leve, pronta para integração com qualquer frontend moderno. Os filtros nativos e o Firebase PHP-JWT simplificam o gerenciamento e a manutenção das rotas protegidas.
Fontes oficiais
Partilhar
Qual é a sua reação?
Gosto
0
Não gosto
0
Adoro
0
Divertido
0
Irritado
0
Triste
0
Uau
0