Skip to content

Commit 575aac1

Browse files
committed
Auth server generate M2M Admin token
1 parent b49cc2f commit 575aac1

File tree

3 files changed

+66
-23
lines changed

3 files changed

+66
-23
lines changed

packages/authorization-server/src/services/tokenService.ts

+1
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ export function tokenServiceBuilder({
227227
const token = await tokenGenerator.generateInteropApiToken({
228228
sub: jwt.payload.sub,
229229
consumerId: key.consumerId,
230+
clientAdminId: key.adminId,
230231
});
231232

232233
logTokenGenerationInfo({

packages/commons/src/interop-token/interopTokenService.ts

+25-8
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
1-
import crypto from "crypto";
21
import { KMSClient, SignCommand, SignCommandInput } from "@aws-sdk/client-kms";
2+
import crypto from "crypto";
33
import {
4+
ClientAssertionDigest,
45
ClientId,
56
generateId,
67
PurposeId,
78
TenantId,
8-
ClientAssertionDigest,
9+
UserId,
910
} from "pagopa-interop-models";
11+
import { systemRole } from "../auth/authData.js";
12+
import { AuthorizationServerTokenGenerationConfig } from "../config/authorizationServerTokenGenerationConfig.js";
1013
import { SessionTokenGenerationConfig } from "../config/sessionTokenGenerationConfig.js";
1114
import { TokenGenerationConfig } from "../config/tokenGenerationConfig.js";
12-
import { AuthorizationServerTokenGenerationConfig } from "../config/authorizationServerTokenGenerationConfig.js";
1315
import { dateToSeconds } from "../utils/date.js";
1416
import {
1517
CustomClaims,
16-
GENERATED_INTEROP_TOKEN_M2M_ROLE,
1718
InteropApiToken,
1819
InteropConsumerToken,
19-
InteropJwtApiPayload,
20+
InteropJwtApiOrganizationClientPayload,
21+
InteropJWTApiPayload,
2022
InteropJwtConsumerPayload,
2123
InteropJwtHeader,
2224
InteropJwtPayload,
@@ -140,9 +142,11 @@ export class InteropTokenGenerator {
140142
public async generateInteropApiToken({
141143
sub,
142144
consumerId,
145+
clientAdminId,
143146
}: {
144147
sub: ClientId;
145148
consumerId: TenantId;
149+
clientAdminId?: UserId;
146150
}): Promise<InteropApiToken> {
147151
if (
148152
!this.config.generatedInteropTokenKid ||
@@ -164,7 +168,7 @@ export class InteropTokenGenerator {
164168
kid: this.config.generatedInteropTokenKid,
165169
};
166170

167-
const payload: InteropJwtApiPayload = {
171+
const userDataPayload: InteropJwtApiOrganizationClientPayload = {
168172
jti: generateId(),
169173
iss: this.config.generatedInteropTokenIssuer,
170174
aud: this.toJwtAudience(this.config.generatedInteropTokenM2MAudience),
@@ -175,7 +179,20 @@ export class InteropTokenGenerator {
175179
exp:
176180
currentTimestamp + this.config.generatedInteropTokenM2MDurationSeconds,
177181
[ORGANIZATION_ID_CLAIM]: consumerId,
178-
[ROLE_CLAIM]: GENERATED_INTEROP_TOKEN_M2M_ROLE,
182+
};
183+
184+
const systemRolePayload = clientAdminId
185+
? {
186+
[ROLE_CLAIM]: systemRole.M2M_ADMIN_ROLE,
187+
userId: clientAdminId,
188+
}
189+
: {
190+
[ROLE_CLAIM]: systemRole.M2M_ROLE,
191+
};
192+
193+
const payload: InteropJWTApiPayload = {
194+
...userDataPayload,
195+
...systemRolePayload,
179196
};
180197

181198
const serializedToken = await this.createAndSignToken({
@@ -259,7 +276,7 @@ export class InteropTokenGenerator {
259276
| InteropJwtPayload
260277
| SessionJwtPayload
261278
| InteropJwtConsumerPayload
262-
| InteropJwtApiPayload;
279+
| InteropJWTApiPayload;
263280
keyId: string;
264281
}): Promise<string> {
265282
const serializedToken = `${b64UrlEncode(

packages/commons/src/interop-token/models.ts

+40-15
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
UserId,
77
} from "pagopa-interop-models";
88
import { z } from "zod";
9+
import { SystemRole } from "../auth/authData.js";
910

1011
export const ORGANIZATION = "organization";
1112
export const UID = "uid";
@@ -19,7 +20,6 @@ export const ORGANIZATION_EXTERNAL_ID_ORIGIN_CLAIM = "origin";
1920
export const ORGANIZATION_EXTERNAL_ID_VALUE_CLAIM = "value";
2021
export const USER_ROLES = "user-roles";
2122
const PURPOSE_ID_CLAIM = "purposeId";
22-
export const GENERATED_INTEROP_TOKEN_M2M_ROLE = "m2m";
2323
export const ROLE_CLAIM = "role";
2424

2525
export interface InteropJwtHeader {
@@ -38,44 +38,69 @@ export type InteropJwtCommonPayload = {
3838
exp: number;
3939
};
4040

41+
/* ==========================================
42+
Interop CONSUMER Token
43+
========================================== */
4144
export type InteropJwtConsumerPayload = InteropJwtCommonPayload & {
4245
client_id: ClientId;
4346
sub: ClientId;
4447
[PURPOSE_ID_CLAIM]: PurposeId;
4548
digest?: ClientAssertionDigest;
4649
};
4750

48-
export type InteropJwtApiPayload = InteropJwtCommonPayload & {
51+
export type InteropConsumerToken = {
52+
header: InteropJwtHeader;
53+
payload: InteropJwtConsumerPayload;
54+
serialized: string;
55+
};
56+
57+
/* ==========================================
58+
Interop API Token
59+
========================================== */
60+
export type InteropJwtApiOrganizationClientPayload = InteropJwtCommonPayload & {
4961
client_id: ClientId;
5062
sub: ClientId;
5163
[ORGANIZATION_ID_CLAIM]: TenantId;
52-
[ROLE_CLAIM]: string;
53-
user_id?: UserId;
5464
};
5565

56-
export type InteropJwtPayload = InteropJwtCommonPayload & {
57-
sub: string;
58-
role: string;
66+
export type InteropJwtApiM2MPayload = InteropJwtApiOrganizationClientPayload & {
67+
[ROLE_CLAIM]: Extract<SystemRole, "m2m">;
5968
};
6069

61-
export type InteropToken = {
70+
export type InteropJwtApiM2MAdminPayload =
71+
InteropJwtApiOrganizationClientPayload & {
72+
[ROLE_CLAIM]: Extract<SystemRole, "m2m-admin">;
73+
userId: UserId;
74+
// ^ ID of the admin user associated with the client
75+
};
76+
77+
export type InteropJWTApiPayload =
78+
| InteropJwtApiM2MAdminPayload
79+
| InteropJwtApiM2MPayload;
80+
81+
export type InteropApiToken = {
6282
header: InteropJwtHeader;
63-
payload: InteropJwtPayload;
83+
payload: InteropJWTApiPayload;
6484
serialized: string;
6585
};
6686

67-
export type InteropConsumerToken = {
68-
header: InteropJwtHeader;
69-
payload: InteropJwtConsumerPayload;
70-
serialized: string;
87+
/* ==========================================
88+
Interop INTERNAL Token
89+
========================================== */
90+
export type InteropJwtPayload = InteropJwtCommonPayload & {
91+
sub: string;
92+
role: string;
7193
};
7294

73-
export type InteropApiToken = {
95+
export type InteropToken = {
7496
header: InteropJwtHeader;
75-
payload: InteropJwtApiPayload;
97+
payload: InteropJwtPayload;
7698
serialized: string;
7799
};
78100

101+
/* ==========================================
102+
Interop SESSION Token
103+
========================================== */
79104
const Organization = z.object({
80105
id: z.string(),
81106
name: z.string(),

0 commit comments

Comments
 (0)