@ditsmod/jwt
Модуль @ditsmod/jwt
інтегрує jsonwebtoken у Ditsmod-застосунок для аутентифікації, що працює на основі JSON Web Token. Готовий приклад використання цього модуля можете проглянути в репозиторії Ditsmod.
Встановлення та підключення
Встановлення:
npm i @ditsmod/jwt
Підключення:
import { featureModule } from '@ditsmod/core';
import { JwtModule } from '@ditsmod/jwt';
import { AuthController } from './auth.controller.js';
import { BearerGuard } from './bearer.guard.js';
const moduleWithParams = JwtModule.withParams({ secret: 'hard-to-guess-secret', signOptions: { expiresIn: '2m' } });
@featureModule({
imports: [moduleWithParams],
controllers: [AuthController],
providersPerReq: [BearerGuard],
exports: [BearerGuard]
})
export class AuthModule {}
Як бачите, під час імпорту можна передавати певні опції для JwtModule
.
Тепер в межах AuthModule
можете використовувати JwtService
:
import { injectable, CanActivate, Injector, RequestContext } from '@ditsmod/core';
import { JwtService, VerifyErrors, JWT_PAYLOAD } from '@ditsmod/jwt';
@injectable()
export class BearerGuard implements CanActivate {
constructor(
private jwtService: JwtService,
private injector: Injector
) {}
async canActivate(ctx: RequestContext) {
const authValue = ctx.nodeReq.headers.authorization?.split(' ');
if (authValue?.[0] != 'Bearer') {
return false;
}
const token = authValue[1];
const payload = await this.jwtService
.verifyWithSecret(token)
.then((payload) => payload)
.catch((err: VerifyErrors) => false as const); // Here `as const` to narrow down returned type.
if (payload) {
this.injector.setByToken(JWT_PAYLOAD, payload);
return true;
} else {
return false;
}
}
}
Що таке ґарди, можете прочитати у розділі Guards (охоронці).