Aller au contenu principal

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.

src/auth/auth.module.ts
@Module({
imports: [
PassportModule,
JwtModule.register({
secret: 'Le secret utilisé pour signer le jeton!',
signOptions: { expiresIn: '30d' },
}),
],
controllers: [AuthController],
providers: [AuthService]
})
export class AuthModule {}
info

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.

  1. Vous pouvez ajouter deux entrées à votre fichier .env:
env
#...
JWT_SECRET=40AB78FD250242DB893CBDAE88A50B6BC4F8846A6804E9AAE5B5712C8EB44473
JWT_EXPIRES_IN=30d
attention

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.

  1. Ensuite, il serait logique d'utiliser ces valeurs dans AuthModule directement comme ceci:
src/auth/auth.module.ts
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

src/auth/auth.module.ts
@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]
})