@alexdevco/passport 1.0.9 → 1.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/interfaces/ jwt.interface.d.ts +14 -0
- package/dist/interfaces/passport-async-options.interface.d.ts +12 -0
- package/dist/interfaces/passport-options.interface.d.ts +15 -0
- package/dist/interfaces/token.interface.d.ts +40 -0
- package/dist/passport.module.d.ts +12 -0
- package/dist/passport.module.js +12 -0
- package/dist/passport.providers.d.ts +12 -0
- package/dist/passport.providers.js +12 -0
- package/dist/passport.service.d.ts +14 -0
- package/dist/passport.service.js +14 -0
- package/dist/strategies/hs256.strategy.d.ts +19 -0
- package/dist/strategies/hs256.strategy.js +20 -1
- package/dist/strategies/rs256.strategy.d.ts +24 -0
- package/dist/strategies/rs256.strategy.js +25 -1
- package/dist/utils/base64.d.ts +15 -0
- package/dist/utils/base64.js +20 -4
- package/dist/utils/checks.d.ts +20 -0
- package/dist/utils/checks.js +20 -0
- package/dist/utils/crypto.d.ts +17 -0
- package/dist/utils/crypto.js +17 -0
- package/dist/utils/date.d.ts +3 -0
- package/dist/utils/date.js +3 -0
- package/dist/utils/jwt.d.ts +16 -0
- package/dist/utils/jwt.js +16 -0
- package/package.json +1 -1
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
import type { IPayload, IVerifyResult } from './token.interface';
|
|
2
|
+
/**
|
|
3
|
+
* Интерфейс стратегии JWT.
|
|
4
|
+
* Определяет методы для генерации и верификации JWT токенов.
|
|
5
|
+
*/
|
|
2
6
|
export interface IJWTStrategy {
|
|
7
|
+
/**
|
|
8
|
+
* Генерирует JWT токен на основе полезной нагрузки.
|
|
9
|
+
* @param payload - Данные для включения в токен.
|
|
10
|
+
* @returns Строка с JWT токеном.
|
|
11
|
+
*/
|
|
3
12
|
generate(payload: IPayload): string;
|
|
13
|
+
/**
|
|
14
|
+
* Проверяет действительность JWT токена.
|
|
15
|
+
* @param token - Токен для проверки.
|
|
16
|
+
* @returns Результат проверки токена.
|
|
17
|
+
*/
|
|
4
18
|
verify(token: string): IVerifyResult;
|
|
5
19
|
}
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import type { FactoryProvider, ModuleMetadata } from '@nestjs/common';
|
|
2
2
|
import { IPassportOptions } from './passport-options.interface';
|
|
3
|
+
/**
|
|
4
|
+
* Интерфейс для асинхронной конфигурации модуля Passport.
|
|
5
|
+
* Позволяет настраивать параметры Passport с использованием фабричной функции,
|
|
6
|
+
* что особенно полезно когда параметры зависят от других сервисов или асинхронных операций.
|
|
7
|
+
*/
|
|
3
8
|
export interface IPassportAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
|
|
9
|
+
/**
|
|
10
|
+
* Фабричная функция, которая создает параметры Passport.
|
|
11
|
+
* Может возвращать параметры напрямую или через Promise.
|
|
12
|
+
*/
|
|
4
13
|
useFactory: (...args: any[]) => Promise<IPassportOptions> | IPassportOptions;
|
|
14
|
+
/**
|
|
15
|
+
* Опциональный массив токенов зависимостей, которые будут внедрены в useFactory.
|
|
16
|
+
*/
|
|
5
17
|
inject?: FactoryProvider['inject'];
|
|
6
18
|
}
|
|
@@ -1,5 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Интерфейс параметров конфигурации для модуля Passport.
|
|
3
|
+
* Определяет основные настройки, необходимые для работы с JWT токенами.
|
|
4
|
+
*/
|
|
1
5
|
export interface IPassportOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Секретный ключ, используемый для подписи JWT токенов.
|
|
8
|
+
*/
|
|
2
9
|
secretKey: string;
|
|
10
|
+
/**
|
|
11
|
+
* Публичный ключ, используемый для верификации JWT токенов.
|
|
12
|
+
* Обязателен для асимметричных алгоритмов (например, RS256).
|
|
13
|
+
*/
|
|
3
14
|
publicKey?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Алгоритм шифрования, используемый для создания и проверки токенов.
|
|
17
|
+
* Например: 'HS256', 'RS256' и т.д.
|
|
18
|
+
*/
|
|
4
19
|
strategy: string;
|
|
5
20
|
}
|
|
@@ -1,15 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Интерфейс полезной нагрузки JWT токена (Payload).
|
|
3
|
+
* Содержит информацию о пользователе и метаданные токена.
|
|
4
|
+
*/
|
|
1
5
|
export interface IPayload {
|
|
6
|
+
/**
|
|
7
|
+
* Идентификатор (Subject ID) - уникальный идентификатор пользователя.
|
|
8
|
+
*/
|
|
2
9
|
sub: string | number;
|
|
10
|
+
/**
|
|
11
|
+
* Имя пользователя .
|
|
12
|
+
*/
|
|
3
13
|
name: string;
|
|
14
|
+
/**
|
|
15
|
+
* Время выпуска токена (Issued At) в секундах since Unix epoch.
|
|
16
|
+
*/
|
|
4
17
|
iat: number;
|
|
18
|
+
/**
|
|
19
|
+
* Время истечения срока действия токена (Expiration Time) в секундах since Unix epoch.
|
|
20
|
+
*/
|
|
5
21
|
exp: number;
|
|
6
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Интерфейс заголовка JWT токена (Header).
|
|
25
|
+
* Определяет тип токена и алгоритм шифрования.
|
|
26
|
+
*/
|
|
7
27
|
export interface IHeader {
|
|
28
|
+
/**
|
|
29
|
+
* Алгоритм шифрования, используемый для подписи токена.
|
|
30
|
+
* Например: 'HS256', 'RS256'
|
|
31
|
+
*/
|
|
8
32
|
alg: string;
|
|
33
|
+
/**
|
|
34
|
+
* Тип токена, обычно 'JWT'.
|
|
35
|
+
*/
|
|
9
36
|
typ: string;
|
|
10
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Интерфейс результата верификации токена.
|
|
40
|
+
* Содержит информацию о валидности токена и причине отказа, если он недействителен.
|
|
41
|
+
*/
|
|
11
42
|
export interface IVerifyResult {
|
|
43
|
+
/**
|
|
44
|
+
* Флаг, указывающий, является ли токен действительным.
|
|
45
|
+
*/
|
|
12
46
|
valid: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Причина, по которой токен недействителен (если применимо).
|
|
49
|
+
*/
|
|
13
50
|
reason?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Полезная нагрузка токена, если он действителен.
|
|
53
|
+
*/
|
|
14
54
|
payload?: IPayload;
|
|
15
55
|
}
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import { type DynamicModule } from '@nestjs/common';
|
|
2
2
|
import type { IPassportAsyncOptions, IPassportOptions } from './interfaces';
|
|
3
3
|
export declare class PassportModule {
|
|
4
|
+
/**
|
|
5
|
+
* Регистрирует модуль паспорта с синхронными опциями конфигурации.
|
|
6
|
+
*
|
|
7
|
+
* @param options - Объект с параметрами конфигурации паспорта.
|
|
8
|
+
* @returns Динамический модуль NestJS с настроенными провайдерами и экспортируемыми сервисами.
|
|
9
|
+
*/
|
|
4
10
|
static register(options: IPassportOptions): DynamicModule;
|
|
11
|
+
/**
|
|
12
|
+
* Регистрирует модуль паспорта с асинхронными опциями конфигурации.
|
|
13
|
+
*
|
|
14
|
+
* @param options - Объект с асинхронными параметрами конфигурации паспорта.
|
|
15
|
+
* @returns Динамический модуль NestJS с настроенными провайдерами и экспортируемыми сервисами.
|
|
16
|
+
*/
|
|
5
17
|
static registerAsync(options: IPassportAsyncOptions): DynamicModule;
|
|
6
18
|
}
|
package/dist/passport.module.js
CHANGED
|
@@ -13,6 +13,12 @@ const constants_1 = require("./constants");
|
|
|
13
13
|
const passport_providers_1 = require("./passport.providers");
|
|
14
14
|
const passport_service_1 = require("./passport.service");
|
|
15
15
|
let PassportModule = PassportModule_1 = class PassportModule {
|
|
16
|
+
/**
|
|
17
|
+
* Регистрирует модуль паспорта с синхронными опциями конфигурации.
|
|
18
|
+
*
|
|
19
|
+
* @param options - Объект с параметрами конфигурации паспорта.
|
|
20
|
+
* @returns Динамический модуль NestJS с настроенными провайдерами и экспортируемыми сервисами.
|
|
21
|
+
*/
|
|
16
22
|
static register(options) {
|
|
17
23
|
const optionsProvider = (0, passport_providers_1.createPassportOptionsProvider)(options);
|
|
18
24
|
return {
|
|
@@ -21,6 +27,12 @@ let PassportModule = PassportModule_1 = class PassportModule {
|
|
|
21
27
|
exports: [passport_service_1.PassportService, constants_1.PASSPORT_OPTIONS]
|
|
22
28
|
};
|
|
23
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Регистрирует модуль паспорта с асинхронными опциями конфигурации.
|
|
32
|
+
*
|
|
33
|
+
* @param options - Объект с асинхронными параметрами конфигурации паспорта.
|
|
34
|
+
* @returns Динамический модуль NestJS с настроенными провайдерами и экспортируемыми сервисами.
|
|
35
|
+
*/
|
|
24
36
|
static registerAsync(options) {
|
|
25
37
|
const optionProvider = (0, passport_providers_1.createPassportAsyncOptionsProvider)(options);
|
|
26
38
|
return {
|
|
@@ -1,4 +1,16 @@
|
|
|
1
1
|
import type { Provider } from '@nestjs/common';
|
|
2
2
|
import type { IPassportAsyncOptions, IPassportOptions } from './interfaces';
|
|
3
|
+
/**
|
|
4
|
+
* Создает провайдер для синхронных опций паспорта.
|
|
5
|
+
*
|
|
6
|
+
* @param options - Синхронные опции паспорта
|
|
7
|
+
* @returns Провайдер NestJS с замороженными опциями паспорта
|
|
8
|
+
*/
|
|
3
9
|
export declare function createPassportOptionsProvider(options: IPassportOptions): Provider;
|
|
10
|
+
/**
|
|
11
|
+
* Создает асинхронный провайдер для опций паспорта.
|
|
12
|
+
*
|
|
13
|
+
* @param options - Асинхронные опции паспорта
|
|
14
|
+
* @returns Провайдер NestJS с асинхронно разрешенными и замороженными опциями паспорта
|
|
15
|
+
*/
|
|
4
16
|
export declare function createPassportAsyncOptionsProvider(options: IPassportAsyncOptions): Provider;
|
|
@@ -3,12 +3,24 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createPassportOptionsProvider = createPassportOptionsProvider;
|
|
4
4
|
exports.createPassportAsyncOptionsProvider = createPassportAsyncOptionsProvider;
|
|
5
5
|
const constants_1 = require("./constants");
|
|
6
|
+
/**
|
|
7
|
+
* Создает провайдер для синхронных опций паспорта.
|
|
8
|
+
*
|
|
9
|
+
* @param options - Синхронные опции паспорта
|
|
10
|
+
* @returns Провайдер NestJS с замороженными опциями паспорта
|
|
11
|
+
*/
|
|
6
12
|
function createPassportOptionsProvider(options) {
|
|
7
13
|
return {
|
|
8
14
|
provide: constants_1.PASSPORT_OPTIONS,
|
|
9
15
|
useValue: Object.freeze({ ...options })
|
|
10
16
|
};
|
|
11
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Создает асинхронный провайдер для опций паспорта.
|
|
20
|
+
*
|
|
21
|
+
* @param options - Асинхронные опции паспорта
|
|
22
|
+
* @returns Провайдер NestJS с асинхронно разрешенными и замороженными опциями паспорта
|
|
23
|
+
*/
|
|
12
24
|
function createPassportAsyncOptionsProvider(options) {
|
|
13
25
|
return {
|
|
14
26
|
provide: constants_1.PASSPORT_OPTIONS,
|
|
@@ -1,10 +1,24 @@
|
|
|
1
1
|
import { IPassportOptions, IPayload, IVerifyResult } from './interfaces';
|
|
2
|
+
/**
|
|
3
|
+
* Сервис для работы с JWT токенами.
|
|
4
|
+
* Обеспечивает генерацию и верификацию токенов с использованием заданной стратегии.
|
|
5
|
+
*/
|
|
2
6
|
export declare class PassportService {
|
|
3
7
|
private readonly options;
|
|
4
8
|
private readonly SECRET_KEY;
|
|
5
9
|
private readonly PUBLIC_KEY;
|
|
6
10
|
private readonly strategy;
|
|
7
11
|
constructor(options: IPassportOptions);
|
|
12
|
+
/**
|
|
13
|
+
* Генерирует JWT токен на основе переданного payload
|
|
14
|
+
* @param payload - данные для включения в токен
|
|
15
|
+
* @returns JWT токен в виде строки
|
|
16
|
+
*/
|
|
8
17
|
generate(payload: IPayload): string;
|
|
18
|
+
/**
|
|
19
|
+
* Проверяет JWT токен и возвращает результат верификации
|
|
20
|
+
* @param token - JWT токен для проверки
|
|
21
|
+
* @returns Результат верификации токена
|
|
22
|
+
*/
|
|
9
23
|
verify(token: string): IVerifyResult;
|
|
10
24
|
}
|
package/dist/passport.service.js
CHANGED
|
@@ -16,6 +16,10 @@ exports.PassportService = void 0;
|
|
|
16
16
|
const common_1 = require("@nestjs/common");
|
|
17
17
|
const constants_1 = require("./constants");
|
|
18
18
|
const utils_1 = require("./utils");
|
|
19
|
+
/**
|
|
20
|
+
* Сервис для работы с JWT токенами.
|
|
21
|
+
* Обеспечивает генерацию и верификацию токенов с использованием заданной стратегии.
|
|
22
|
+
*/
|
|
19
23
|
let PassportService = class PassportService {
|
|
20
24
|
options;
|
|
21
25
|
SECRET_KEY;
|
|
@@ -27,9 +31,19 @@ let PassportService = class PassportService {
|
|
|
27
31
|
this.PUBLIC_KEY = options.publicKey;
|
|
28
32
|
this.strategy = (0, utils_1.getStrategy)(options.strategy, this.SECRET_KEY, this.PUBLIC_KEY);
|
|
29
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Генерирует JWT токен на основе переданного payload
|
|
36
|
+
* @param payload - данные для включения в токен
|
|
37
|
+
* @returns JWT токен в виде строки
|
|
38
|
+
*/
|
|
30
39
|
generate(payload) {
|
|
31
40
|
return this.strategy.generate(payload);
|
|
32
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Проверяет JWT токен и возвращает результат верификации
|
|
44
|
+
* @param token - JWT токен для проверки
|
|
45
|
+
* @returns Результат верификации токена
|
|
46
|
+
*/
|
|
33
47
|
verify(token) {
|
|
34
48
|
return this.strategy.verify(token);
|
|
35
49
|
}
|
|
@@ -6,7 +6,26 @@ export declare class HS256Strategy implements IJWTStrategy {
|
|
|
6
6
|
private static readonly JWT_ALG;
|
|
7
7
|
private static readonly PARTS_LENGTH;
|
|
8
8
|
constructor(secret: string);
|
|
9
|
+
/**
|
|
10
|
+
* Генерирует JWT токен на основе переданной полезной нагрузки.
|
|
11
|
+
*
|
|
12
|
+
* @param payload - Полезная нагрузка для включения в токен.
|
|
13
|
+
* @returns Строка сгенерированного JWT токена.
|
|
14
|
+
*/
|
|
9
15
|
generate(payload: IPayload): string;
|
|
16
|
+
/**
|
|
17
|
+
* Проверяет действительность и срок действия переданного токена.
|
|
18
|
+
*
|
|
19
|
+
* @param token - Токен для проверки.
|
|
20
|
+
* @returns Результат проверки токена.
|
|
21
|
+
*/
|
|
10
22
|
verify(token: string): IVerifyResult;
|
|
23
|
+
/**
|
|
24
|
+
* Вычисляет HMAC-подпись для переданных данных, используя секретный ключ.
|
|
25
|
+
* Алгоритм шифрования: SHA-256.
|
|
26
|
+
*
|
|
27
|
+
* @param data - Данные, для которых необходимо вычислить подпись.
|
|
28
|
+
* @returns Подпись в виде строки шестнадцатеричного формата.
|
|
29
|
+
*/
|
|
11
30
|
private computeHmac;
|
|
12
31
|
}
|
|
@@ -11,6 +11,12 @@ class HS256Strategy {
|
|
|
11
11
|
constructor(secret) {
|
|
12
12
|
this.SECRET_KEY = secret;
|
|
13
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Генерирует JWT токен на основе переданной полезной нагрузки.
|
|
16
|
+
*
|
|
17
|
+
* @param payload - Полезная нагрузка для включения в токен.
|
|
18
|
+
* @returns Строка сгенерированного JWT токена.
|
|
19
|
+
*/
|
|
14
20
|
generate(payload) {
|
|
15
21
|
const header = { alg: HS256Strategy.JWT_ALG, typ: 'JWT' };
|
|
16
22
|
const headerB64 = (0, utils_1.base64UrlEncode)(JSON.stringify(header));
|
|
@@ -19,6 +25,12 @@ class HS256Strategy {
|
|
|
19
25
|
const mac = this.computeHmac(serialized);
|
|
20
26
|
return (0, utils_1.serialize)([serialized, mac], HS256Strategy.INTERNAL_SEPARATOR);
|
|
21
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Проверяет действительность и срок действия переданного токена.
|
|
30
|
+
*
|
|
31
|
+
* @param token - Токен для проверки.
|
|
32
|
+
* @returns Результат проверки токена.
|
|
33
|
+
*/
|
|
22
34
|
verify(token) {
|
|
23
35
|
const parts = token.split(HS256Strategy.INTERNAL_SEPARATOR);
|
|
24
36
|
if (parts.length !== HS256Strategy.PARTS_LENGTH) {
|
|
@@ -36,10 +48,17 @@ class HS256Strategy {
|
|
|
36
48
|
const payload = parsed;
|
|
37
49
|
if (!Number.isFinite(payload.exp))
|
|
38
50
|
return { valid: false, reason: 'Expired error format' };
|
|
39
|
-
if (
|
|
51
|
+
if ((0, utils_1.now)() > payload.exp)
|
|
40
52
|
return { valid: false, reason: 'Token is expired' };
|
|
41
53
|
return { valid: true, payload };
|
|
42
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Вычисляет HMAC-подпись для переданных данных, используя секретный ключ.
|
|
57
|
+
* Алгоритм шифрования: SHA-256.
|
|
58
|
+
*
|
|
59
|
+
* @param data - Данные, для которых необходимо вычислить подпись.
|
|
60
|
+
* @returns Подпись в виде строки шестнадцатеричного формата.
|
|
61
|
+
*/
|
|
43
62
|
computeHmac(data) {
|
|
44
63
|
return (0, crypto_1.createHmac)('sha256', this.SECRET_KEY).update(data).digest('hex');
|
|
45
64
|
}
|
|
@@ -6,8 +6,32 @@ export declare class RS256Strategy implements IJWTStrategy {
|
|
|
6
6
|
private static readonly INTERNAL_SEPARATOR;
|
|
7
7
|
private static readonly JWT_ALG;
|
|
8
8
|
private static readonly PARTS_LENGTH;
|
|
9
|
+
/**
|
|
10
|
+
* Конструктор класса RS256Strategy
|
|
11
|
+
*
|
|
12
|
+
* @param secretKey - закрытый ключ для подписи токенов
|
|
13
|
+
* @param publicKey - открытый ключ для проверки токенов
|
|
14
|
+
*/
|
|
9
15
|
constructor(secretKey: string, publicKey: string);
|
|
16
|
+
/**
|
|
17
|
+
* Генерация JWT токена с использованием алгоритма RS256
|
|
18
|
+
*
|
|
19
|
+
* @param payload - данные для включения в токен
|
|
20
|
+
* @returns сгенерированный JWT токен в виде строки
|
|
21
|
+
*/
|
|
10
22
|
generate(payload: IPayload): string;
|
|
23
|
+
/**
|
|
24
|
+
* Проверка валидности токена
|
|
25
|
+
*
|
|
26
|
+
* @param token - строка токена для проверки
|
|
27
|
+
* @returns результат проверки токена со статусом и возможной полезной нагрузкой
|
|
28
|
+
*/
|
|
11
29
|
verify(token: string): IVerifyResult;
|
|
30
|
+
/**
|
|
31
|
+
* Создание подписи для токена
|
|
32
|
+
*
|
|
33
|
+
* @param data - данные для шифрования
|
|
34
|
+
* @returns зашифрованная строка подписи
|
|
35
|
+
*/
|
|
12
36
|
private computeRSA;
|
|
13
37
|
}
|
|
@@ -9,10 +9,22 @@ class RS256Strategy {
|
|
|
9
9
|
static INTERNAL_SEPARATOR = '.';
|
|
10
10
|
static JWT_ALG = 'RSA-SHA256';
|
|
11
11
|
static PARTS_LENGTH = 3;
|
|
12
|
+
/**
|
|
13
|
+
* Конструктор класса RS256Strategy
|
|
14
|
+
*
|
|
15
|
+
* @param secretKey - закрытый ключ для подписи токенов
|
|
16
|
+
* @param publicKey - открытый ключ для проверки токенов
|
|
17
|
+
*/
|
|
12
18
|
constructor(secretKey, publicKey) {
|
|
13
19
|
this.SECRET_KEY = secretKey;
|
|
14
20
|
this.PUBLIC_KEY = publicKey;
|
|
15
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Генерация JWT токена с использованием алгоритма RS256
|
|
24
|
+
*
|
|
25
|
+
* @param payload - данные для включения в токен
|
|
26
|
+
* @returns сгенерированный JWT токен в виде строки
|
|
27
|
+
*/
|
|
16
28
|
generate(payload) {
|
|
17
29
|
const header = { alg: 'RS256', typ: 'JWT' };
|
|
18
30
|
const headerB64 = (0, utils_1.base64UrlEncode)(JSON.stringify(header));
|
|
@@ -21,6 +33,12 @@ class RS256Strategy {
|
|
|
21
33
|
const mac = this.computeRSA(serialized);
|
|
22
34
|
return (0, utils_1.serialize)([serialized, mac], RS256Strategy.INTERNAL_SEPARATOR);
|
|
23
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Проверка валидности токена
|
|
38
|
+
*
|
|
39
|
+
* @param token - строка токена для проверки
|
|
40
|
+
* @returns результат проверки токена со статусом и возможной полезной нагрузкой
|
|
41
|
+
*/
|
|
24
42
|
verify(token) {
|
|
25
43
|
const parts = token.split(RS256Strategy.INTERNAL_SEPARATOR);
|
|
26
44
|
if (parts.length !== RS256Strategy.PARTS_LENGTH)
|
|
@@ -37,10 +55,16 @@ class RS256Strategy {
|
|
|
37
55
|
const payload = parsed;
|
|
38
56
|
if (!Number.isFinite(payload.exp))
|
|
39
57
|
return { valid: false, reason: 'Expired error format' };
|
|
40
|
-
if (
|
|
58
|
+
if ((0, utils_1.now)() > payload.exp)
|
|
41
59
|
return { valid: false, reason: 'Token is expired' };
|
|
42
60
|
return { valid: true, payload };
|
|
43
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Создание подписи для токена
|
|
64
|
+
*
|
|
65
|
+
* @param data - данные для шифрования
|
|
66
|
+
* @returns зашифрованная строка подписи
|
|
67
|
+
*/
|
|
44
68
|
computeRSA(data) {
|
|
45
69
|
const sign = (0, crypto_1.createSign)(RS256Strategy.JWT_ALG)
|
|
46
70
|
.update(data)
|
package/dist/utils/base64.d.ts
CHANGED
|
@@ -1,2 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Кодирует буфер или строку в формат Base64URL.
|
|
3
|
+
* Base64URL - это модифицированная версия стандартного Base64,
|
|
4
|
+
* используемая в JWT токенах для безопасной передачи данных в URL.
|
|
5
|
+
*
|
|
6
|
+
* @param buf - Буфер или строка для кодирования
|
|
7
|
+
* @returns Строка в формате Base64URL
|
|
8
|
+
*/
|
|
1
9
|
export declare function base64UrlEncode(buf: Buffer | string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Декодирует строку из формата Base64URL в обычную строку.
|
|
12
|
+
* Обратная операция к base64UrlEncode.
|
|
13
|
+
*
|
|
14
|
+
* @param str - Строка в формате Base64URL для декодирования
|
|
15
|
+
* @returns Декодированная строка
|
|
16
|
+
*/
|
|
2
17
|
export declare function base64UrlDecode(str: string): string;
|
package/dist/utils/base64.js
CHANGED
|
@@ -2,16 +2,32 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.base64UrlEncode = base64UrlEncode;
|
|
4
4
|
exports.base64UrlDecode = base64UrlDecode;
|
|
5
|
+
/**
|
|
6
|
+
* Кодирует буфер или строку в формат Base64URL.
|
|
7
|
+
* Base64URL - это модифицированная версия стандартного Base64,
|
|
8
|
+
* используемая в JWT токенах для безопасной передачи данных в URL.
|
|
9
|
+
*
|
|
10
|
+
* @param buf - Буфер или строка для кодирования
|
|
11
|
+
* @returns Строка в формате Base64URL
|
|
12
|
+
*/
|
|
5
13
|
function base64UrlEncode(buf) {
|
|
6
14
|
const buffer = typeof buf === 'string' ? Buffer.from(buf) : buf;
|
|
7
15
|
return buffer
|
|
8
16
|
.toString('base64')
|
|
9
|
-
.replace(/\+/g, '-')
|
|
10
|
-
.replace(/\//g, '_')
|
|
11
|
-
.replace(/=+$/, '');
|
|
17
|
+
.replace(/\+/g, '-') // Заменяем + на -
|
|
18
|
+
.replace(/\//g, '_') // Заменяем / на _
|
|
19
|
+
.replace(/=+$/, ''); // Удаляем символы заполнения в конце
|
|
12
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Декодирует строку из формата Base64URL в обычную строку.
|
|
23
|
+
* Обратная операция к base64UrlEncode.
|
|
24
|
+
*
|
|
25
|
+
* @param str - Строка в формате Base64URL для декодирования
|
|
26
|
+
* @returns Декодированная строка
|
|
27
|
+
*/
|
|
13
28
|
function base64UrlDecode(str) {
|
|
14
|
-
str = str.replace(/-/g, '+').replace(/_/g, '/');
|
|
29
|
+
str = str.replace(/-/g, '+').replace(/_/g, '/'); // Восстанавливаем оригинальные символы Base64
|
|
30
|
+
// Добавляем символы заполнения, если длина не кратна 4
|
|
15
31
|
while (str.length % 4)
|
|
16
32
|
str += '=';
|
|
17
33
|
return Buffer.from(str, 'base64').toString();
|
package/dist/utils/checks.d.ts
CHANGED
|
@@ -1,3 +1,23 @@
|
|
|
1
1
|
import { IHeader, IPayload } from '../interfaces';
|
|
2
|
+
/**
|
|
3
|
+
* Проверяет, является ли переданный объект полезной нагрузкой токена.
|
|
4
|
+
* Объект считается полезной нагрузкой, если:
|
|
5
|
+
* - свойство sub является строкой или числом
|
|
6
|
+
* - свойство name является строкой
|
|
7
|
+
* - свойство iat является числом
|
|
8
|
+
* - свойство exp является числом
|
|
9
|
+
*
|
|
10
|
+
* @param data - проверяемый объект
|
|
11
|
+
* @returns true, если объект соответствует интерфейсу IPayload, иначе false
|
|
12
|
+
*/
|
|
2
13
|
export declare function isPayload(data: any): data is IPayload;
|
|
14
|
+
/**
|
|
15
|
+
* Проверяет, является ли переданный объект заголовком токена.
|
|
16
|
+
* Объект считается заголовком, если:
|
|
17
|
+
* - свойство alg является строкой
|
|
18
|
+
* - свойство typ является строкой
|
|
19
|
+
*
|
|
20
|
+
* @param data - проверяемый объект
|
|
21
|
+
* @returns true, если объект соответствует интерфейсу IHeader, иначе false
|
|
22
|
+
*/
|
|
3
23
|
export declare function isHeader(data: any): data is IHeader;
|
package/dist/utils/checks.js
CHANGED
|
@@ -2,12 +2,32 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.isPayload = isPayload;
|
|
4
4
|
exports.isHeader = isHeader;
|
|
5
|
+
/**
|
|
6
|
+
* Проверяет, является ли переданный объект полезной нагрузкой токена.
|
|
7
|
+
* Объект считается полезной нагрузкой, если:
|
|
8
|
+
* - свойство sub является строкой или числом
|
|
9
|
+
* - свойство name является строкой
|
|
10
|
+
* - свойство iat является числом
|
|
11
|
+
* - свойство exp является числом
|
|
12
|
+
*
|
|
13
|
+
* @param data - проверяемый объект
|
|
14
|
+
* @returns true, если объект соответствует интерфейсу IPayload, иначе false
|
|
15
|
+
*/
|
|
5
16
|
function isPayload(data) {
|
|
6
17
|
return ((typeof data.sub === 'string' || typeof data.sub === 'number') &&
|
|
7
18
|
typeof data.name === 'string' &&
|
|
8
19
|
typeof data.iat === 'number' &&
|
|
9
20
|
typeof data.exp === 'number');
|
|
10
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Проверяет, является ли переданный объект заголовком токена.
|
|
24
|
+
* Объект считается заголовком, если:
|
|
25
|
+
* - свойство alg является строкой
|
|
26
|
+
* - свойство typ является строкой
|
|
27
|
+
*
|
|
28
|
+
* @param data - проверяемый объект
|
|
29
|
+
* @returns true, если объект соответствует интерфейсу IHeader, иначе false
|
|
30
|
+
*/
|
|
11
31
|
function isHeader(data) {
|
|
12
32
|
return typeof data.alg === 'string' && typeof data.typ === 'string';
|
|
13
33
|
}
|
package/dist/utils/crypto.d.ts
CHANGED
|
@@ -1,4 +1,21 @@
|
|
|
1
1
|
import { Verify } from 'crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Сравнивает две строки за константное время для предотвращения атак по времени
|
|
4
|
+
* @param a - первая строка для сравнения
|
|
5
|
+
* @param b - вторая строка для сравнения
|
|
6
|
+
* @returns true, если строки идентичны, false в противном случае
|
|
7
|
+
*/
|
|
2
8
|
export declare function constantTimeEqual(a: string, b: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Создаёт объект для проверки подписи RSA-SHA256 на основе переданных данных
|
|
11
|
+
* @param data - данные для проверки подписи
|
|
12
|
+
* @returns объект Verify, готовый к проверке подписи
|
|
13
|
+
*/
|
|
3
14
|
export declare function getVerifyRSA(data: string): Verify;
|
|
15
|
+
/**
|
|
16
|
+
* Объединяет массив строк в одну строку с указанным разделителем
|
|
17
|
+
* @param arr - массив строк для объединения
|
|
18
|
+
* @param separator - разделитель между элементами массива
|
|
19
|
+
* @returns объединённая строка
|
|
20
|
+
*/
|
|
4
21
|
export declare function serialize(arr: string[], separator: string): string;
|
package/dist/utils/crypto.js
CHANGED
|
@@ -4,6 +4,12 @@ exports.constantTimeEqual = constantTimeEqual;
|
|
|
4
4
|
exports.getVerifyRSA = getVerifyRSA;
|
|
5
5
|
exports.serialize = serialize;
|
|
6
6
|
const crypto_1 = require("crypto");
|
|
7
|
+
/**
|
|
8
|
+
* Сравнивает две строки за константное время для предотвращения атак по времени
|
|
9
|
+
* @param a - первая строка для сравнения
|
|
10
|
+
* @param b - вторая строка для сравнения
|
|
11
|
+
* @returns true, если строки идентичны, false в противном случае
|
|
12
|
+
*/
|
|
7
13
|
function constantTimeEqual(a, b) {
|
|
8
14
|
const bufA = Buffer.from(a);
|
|
9
15
|
const bufB = Buffer.from(b);
|
|
@@ -11,9 +17,20 @@ function constantTimeEqual(a, b) {
|
|
|
11
17
|
return false;
|
|
12
18
|
return (0, crypto_1.timingSafeEqual)(bufA, bufB);
|
|
13
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Создаёт объект для проверки подписи RSA-SHA256 на основе переданных данных
|
|
22
|
+
* @param data - данные для проверки подписи
|
|
23
|
+
* @returns объект Verify, готовый к проверке подписи
|
|
24
|
+
*/
|
|
14
25
|
function getVerifyRSA(data) {
|
|
15
26
|
return (0, crypto_1.createVerify)('RSA-SHA256').update(data);
|
|
16
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Объединяет массив строк в одну строку с указанным разделителем
|
|
30
|
+
* @param arr - массив строк для объединения
|
|
31
|
+
* @param separator - разделитель между элементами массива
|
|
32
|
+
* @returns объединённая строка
|
|
33
|
+
*/
|
|
17
34
|
function serialize(arr, separator) {
|
|
18
35
|
return arr.join(separator);
|
|
19
36
|
}
|
package/dist/utils/date.d.ts
CHANGED
package/dist/utils/date.js
CHANGED
package/dist/utils/jwt.d.ts
CHANGED
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
import { IJWTStrategy } from '../interfaces/ jwt.interface';
|
|
2
|
+
/**
|
|
3
|
+
* Декодирует JWT токен без проверки подписи.
|
|
4
|
+
* Извлекает и парсит заголовок и полезную нагрузку из токена.
|
|
5
|
+
*
|
|
6
|
+
* @param token - JWT токен для декодирования
|
|
7
|
+
* @returns Объект с декодированным заголовком и полезной нагрузкой
|
|
8
|
+
*/
|
|
2
9
|
export declare function JwtDecode(token: string): {
|
|
3
10
|
header: any;
|
|
4
11
|
payload: any;
|
|
5
12
|
};
|
|
13
|
+
/**
|
|
14
|
+
* Создает экземпляр стратегии JWT на основе указанного типа.
|
|
15
|
+
*
|
|
16
|
+
* @param type - Тип стратегии (например, 'HS256', 'RS256')
|
|
17
|
+
* @param secretKey - Секретный ключ для подписи токенов
|
|
18
|
+
* @param publicKey - Публичный ключ для верификации токенов (обязателен для RS256)
|
|
19
|
+
* @returns Экземпляр соответствующей стратегии JWT
|
|
20
|
+
* @throws Error если указана неподдерживаемая стратегия или отсутствует публичный ключ для RS256
|
|
21
|
+
*/
|
|
6
22
|
export declare function getStrategy(type: string, secretKey: string, publicKey: string | null): IJWTStrategy;
|
package/dist/utils/jwt.js
CHANGED
|
@@ -5,6 +5,13 @@ exports.getStrategy = getStrategy;
|
|
|
5
5
|
const constants_1 = require("../constants");
|
|
6
6
|
const strategies_1 = require("../strategies");
|
|
7
7
|
const base64_1 = require("./base64");
|
|
8
|
+
/**
|
|
9
|
+
* Декодирует JWT токен без проверки подписи.
|
|
10
|
+
* Извлекает и парсит заголовок и полезную нагрузку из токена.
|
|
11
|
+
*
|
|
12
|
+
* @param token - JWT токен для декодирования
|
|
13
|
+
* @returns Объект с декодированным заголовком и полезной нагрузкой
|
|
14
|
+
*/
|
|
8
15
|
function JwtDecode(token) {
|
|
9
16
|
const [header, payload] = token.split('.');
|
|
10
17
|
return {
|
|
@@ -12,6 +19,15 @@ function JwtDecode(token) {
|
|
|
12
19
|
payload: JSON.parse((0, base64_1.base64UrlDecode)(payload))
|
|
13
20
|
};
|
|
14
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Создает экземпляр стратегии JWT на основе указанного типа.
|
|
24
|
+
*
|
|
25
|
+
* @param type - Тип стратегии (например, 'HS256', 'RS256')
|
|
26
|
+
* @param secretKey - Секретный ключ для подписи токенов
|
|
27
|
+
* @param publicKey - Публичный ключ для верификации токенов (обязателен для RS256)
|
|
28
|
+
* @returns Экземпляр соответствующей стратегии JWT
|
|
29
|
+
* @throws Error если указана неподдерживаемая стратегия или отсутствует публичный ключ для RS256
|
|
30
|
+
*/
|
|
15
31
|
function getStrategy(type, secretKey, publicKey) {
|
|
16
32
|
switch (type) {
|
|
17
33
|
case constants_1.JWTStrategy.HS256:
|