Перейти до основного вмісту

@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 (охоронці).