CodeIgniter 4: JWT-Token-basierte Authentifizierung erstellen
Vollständiger Leitfaden zur Implementierung einer zustandslosen JWT-Authentifizierung in CodeIgniter 4 zum Schutz von RESTful APIs.
Bei modernen RESTful APIs und entkoppelten Anwendungen wie React- oder Vue-SPAs und mobilen Apps ist eine klassische sitzungsbasierte Authentifizierung nicht immer ideal. JSON Web Tokens (JWT) sind eine Standardlösung für zustandslose, sichere und skalierbare Authentifizierung.
Warum JWT mit CodeIgniter 4 verwenden?
Die Integration von JWT in CodeIgniter 4 bietet mehrere architektonische Vorteile:
- Zustandslos: Der Server muss nicht für jede Anfrage einen Sitzungsstatus in Datenbank oder Cache speichern.
- Native Filter: CodeIgniter-4-Filter können den Authorization-Header vor der Ausführung eines Controllers prüfen.
- Flexibilität: Das Token enthält die signierte Nutzlast zur Identifikation von Benutzer und Rollen.
1. Geheimen Schlüssel und Abhängigkeiten konfigurieren
Zunächst wird die Standardbibliothek für JWT über Composer installiert:
composer require firebase/php-jwt
Danach wird im Projekt in der Datei .env ein starker geheimer Schlüssel zum Signieren der Tokens definiert:
JWT_SECRET_KEY = 'la_tua_chiave_segreta_molto_lunga_e_sicura'
JWT_TIME_TO_LIVE = 3600
2. Token beim Login erzeugen
Im Authentifizierungscontroller, zum Beispiel AuthController.php, werden die Zugangsdaten geprüft und bei Erfolg ein JWT als JSON zurückgegeben:
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. Routen mit einem JWT-Filter schützen
Um das Token bei jeder geschützten Anfrage zu validieren, wird ein Filter unter App/Filters/JWTAuthFilter.php erstellt:
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)
{
}
}
Fazit
JWT ermöglicht in CodeIgniter 4 eine saubere, schlanke API-Architektur, die sich in jedes moderne Frontend integrieren lässt. Native Filter und Firebase PHP-JWT vereinfachen Verwaltung und Wartung geschützter Routen.
Offizielle Quellen
Teilen
Was ist Ihre Reaktion?
Gefällt mir
0
Gefällt mir nicht
0
Liebe
0
Lustig
0
Wütend
0
Traurig
0
Wow
0