CodeIgniter 4 : créer un système d'authentification par jetons JWT

Guide complet pour mettre en œuvre une authentification stateless avec JSON Web Token dans CodeIgniter 4 et protéger des API RESTful.

CodeIgniter 4 : créer un système d'authentification par jetons JWT

Pour les API RESTful modernes et les applications découplées, notamment les SPA React ou Vue et les applications mobiles, l'authentification classique par session n'est pas toujours idéale. Les JSON Web Tokens (JWT) constituent une solution standard pour une authentification stateless, sûre et évolutive.

Pourquoi utiliser JWT avec CodeIgniter 4 ?

L'intégration de JWT dans CodeIgniter 4 offre plusieurs avantages architecturaux :

  • Stateless : le serveur n'a pas besoin d'enregistrer l'état de session en base de données ou en cache pour chaque requête.
  • Filtres natifs : les Filters de CodeIgniter 4 peuvent intercepter et valider l'en-tête d'autorisation avant l'exécution des contrôleurs.
  • Souplesse : le jeton contient la charge utile signée nécessaire pour identifier l'utilisateur et ses rôles.

1. Configurer la clé secrète et les dépendances

Installez d'abord la bibliothèque JWT standard avec Composer :

composer require firebase/php-jwt

Définissez ensuite une clé secrète robuste dans le fichier .env du projet afin de signer les jetons :

JWT_SECRET_KEY = 'la_tua_chiave_segreta_molto_lunga_e_sicura'
JWT_TIME_TO_LIVE = 3600

2. Générer le jeton lors de la connexion

Dans le contrôleur d'authentification, par exemple AuthController.php, vérifiez les identifiants et générez un JWT renvoyé au format JSON lorsqu'ils sont corrects :

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. Protéger les routes avec un filtre JWT

Pour valider le jeton lors de chaque requête protégée, créez un filtre dans 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)
    {
    }
}

Conclusion

JWT permet de bâtir dans CodeIgniter 4 une architecture d'API claire et légère, prête à s'intégrer à tout frontend moderne. Les filtres natifs associés à Firebase PHP-JWT simplifient la gestion et la maintenance des routes protégées.

Sources officielles

Partager

Quelle est votre réaction ?

Aimer Aimer 0
Je n'aime pas Je n'aime pas 0
Amour Amour 0
Drôle Drôle 0
En colère En colère 0
Triste Triste 0
Waouh Waouh 0