Skip to content

Commit ec60413

Browse files
committed
feat: add sign payload
1 parent 4762186 commit ec60413

File tree

6 files changed

+25
-206
lines changed

6 files changed

+25
-206
lines changed
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
import { IsString, IsNotEmpty, MaxLength } from "class-validator";
1+
import { IsString, IsNotEmpty, MaxLength, IsNumber } from "class-validator";
22

33
export class IssueRequestDto {
44
@IsString()
55
@IsNotEmpty()
66
@MaxLength(10000, { message: "JWT token is too long" })
77
jwt!: string;
8+
9+
@IsNotEmpty()
10+
@IsNumber({ allowNaN: false, allowInfinity: false, maxDecimalPlaces: 0 }, { each: true })
11+
signPayload!: number[];
812
}

apps/custom-issuer/src/modules/issuer/issuer.controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export class IssuerController {
99
@Post("issue")
1010
@HttpCode(HttpStatus.OK)
1111
async issue(@Body() body: IssueRequestDto): Promise<{ token: string }> {
12-
const token = await this.issuerService.issueToken(body.jwt);
12+
const token = await this.issuerService.issueToken(body.jwt, body.signPayload);
1313
return { token };
1414
}
1515
}

apps/custom-issuer/src/modules/issuer/issuer.errors.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@ export enum ErrorMessage {
77
INVALID_NBF_TYPE = 'JWT "nbf" claim must be a valid integer',
88
TOKEN_NOT_YET_VALID = "JWT token is not yet valid (nbf is in the future)",
99
EXP_BEFORE_NBF = 'JWT "exp" must be after "nbf"',
10+
INVALID_SIGN_PAYLOAD_TYPE = "Invalid sign payload type",
11+
INVALID_SIGN_PAYLOAD_VALUES = "Invalid sign payload values",
1012
}

apps/custom-issuer/src/modules/issuer/issuer.service.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ export class IssuerService {
3535
this.validationIssuerUrl = issuerConfig.validationIssuerUrl;
3636
}
3737

38-
async issueToken(inputJwt: string): Promise<string> {
38+
async issueToken(inputJwt: string, signPayload: number[]): Promise<string> {
3939
const decoded = this.verifyAndDecodeToken(inputJwt);
40-
const claims = this.extractAndValidateClaims(decoded);
40+
const claims = this.extractAndValidateClaims(decoded, signPayload);
4141
return this.createSignedToken(claims);
4242
}
4343

@@ -56,14 +56,15 @@ export class IssuerService {
5656
throw new UnauthorizedException(ErrorMessage.INVALID_TOKEN);
5757
}
5858

59-
private extractAndValidateClaims(decoded: jwt.JwtPayload): TokenClaims {
59+
private extractAndValidateClaims(decoded: jwt.JwtPayload, signPayload: number[]): TokenClaims {
6060
const { sub, exp, nbf, iss } = decoded;
6161

6262
this.validateSubject(sub);
6363
this.validateIssuer(iss);
6464
this.validateTimeClaims(exp, nbf);
65+
this.validateSignPayload(signPayload);
6566

66-
return { sub, exp, nbf };
67+
return { sub, exp, nbf, fatxn: signPayload };
6768
}
6869

6970
private validateSubject(sub: unknown): asserts sub is string {
@@ -124,6 +125,15 @@ export class IssuerService {
124125
}
125126
}
126127

128+
private validateSignPayload(signPayload: unknown): asserts signPayload is number[] {
129+
if (!Array.isArray(signPayload) || new Uint8Array(signPayload)) {
130+
throw new UnauthorizedException(ErrorMessage.INVALID_SIGN_PAYLOAD_TYPE);
131+
}
132+
if (!signPayload.every((num) => Number.isInteger(num) && num >= 0 && num <= 255)) {
133+
throw new UnauthorizedException(ErrorMessage.INVALID_SIGN_PAYLOAD_VALUES);
134+
}
135+
}
136+
127137
private isValidInteger(value: unknown): value is number {
128138
return typeof value === "number" && Number.isInteger(value);
129139
}

apps/custom-issuer/src/modules/issuer/issuer.types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ export type TokenClaims = {
33
exp?: number;
44
nbf?: number;
55
iss?: string;
6+
fatxn: number[];
67
};

pnpm-lock.yaml

Lines changed: 2 additions & 200 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)