37-2 Configuration du module d'authentification
Pour l'authentification au système, on créera un module séparé. En effet, le module utilisateurs est responsable d'inscrire les utilisateurs et toute autre tâche connexe à ces derniers et le module authentification gèrera la connexion.
Créer le module auth et ses service/contrôleur associés
nest g module auth
nest g controller auth
nest g service auth
Configurer le module pour les jetons JWT
Pour utiliser Passport et aussi le module JWT de Nest, on doit importer les deux modules dans notre propre module Auth et ajouter quelques configurations.
@Module({
imports: [
PassportModule,
JwtModule.register({
secret: 'Le secret utilisé pour signer le jeton!',
signOptions: { expiresIn: '30d' },
}),
],
controllers: [AuthController],
providers: [AuthService]
})
export class AuthModule {}
secret: les jetons générés par le serveur sont signés à l'aide d'une clé secrète permettant de vérifier leur authenticité.
signOptions: { expiresIn: '30d' } défini que les jetons doivent expirer après 30 jours, forçant une reconnexion ou une demande de nouveau jeton.
Utilisation de fichier .env pour le secret
Enregistrer des clés privées dans un fichier de l'application devant être envoyée sur git est une idée discutable. C'est pourquoi nous avons créé précédemment un fichier .env pour ces valeurs.
- Vous pouvez ajouter deux entrées à votre fichier
.env:
#...
JWT_SECRET=40AB78FD250242DB893CBDAE88A50B6BC4F8846A6804E9AAE5B5712C8EB44473
JWT_EXPIRES_IN=30d
Le secret doit être impossible à deviner. J'ai utilisé une séquence de 64 chiffres et lettres générée aléatoirement pour le secret.
- Ensuite, il serait logique d'utiliser ces valeurs dans
AuthModuledirectement comme ceci:
JwtModule.register({
secret: process.env.JWT_SECRET,
signOptions: { expiresIn: process.env.JWT_EXPIRES_IN },
}),
Cependant, cela ne fonctionnera pas dû au fait que la configuration n'est pas disponible pour le module. Ce n'est pas un problème lorsque nous en faisons l'utilisation dans AppModule puisque nous initialisons la configuration d'environnement via ConfigModule.forRoot(), juste avant d'utiliser les variables.
3. Charger la configuration d'environnement et assigner les valeurs
@Module({
imports: [
PassportModule,
JwtModule.registerAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: async (configService: ConfigService) => ({
secret: configService.get('JWT_SECRET'),
signOptions: { expiresIn: configService.get('JWT_EXPIRES_IN') },
}),
}),
],
controllers: [AuthController],
providers: [AuthService]
})