CodeIgniter 4: JWT-Token-basierte Authentifizierung erstellen

Vollständiger Leitfaden zur Implementierung einer zustandslosen JWT-Authentifizierung in CodeIgniter 4 zum Schutz von RESTful APIs.

CodeIgniter 4: JWT-Token-basierte Authentifizierung erstellen

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 Gefällt mir 0
Gefällt mir nicht Gefällt mir nicht 0
Liebe Liebe 0
Lustig Lustig 0
Wütend Wütend 0
Traurig Traurig 0
Wow Wow 0