Skip to content

Commit 299c3cc

Browse files
committed
Auth server generate M2M Admin token
1 parent 714af93 commit 299c3cc

File tree

3 files changed

+66
-22
lines changed

3 files changed

+66
-22
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-14
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
TenantId,
66
} from "pagopa-interop-models";
77
import { z } from "zod";
8+
import { SystemRole } from "../auth/authData.js";
89

910
export const ORGANIZATION = "organization";
1011
export const UID = "uid";
@@ -18,7 +19,6 @@ export const ORGANIZATION_EXTERNAL_ID_ORIGIN_CLAIM = "origin";
1819
export const ORGANIZATION_EXTERNAL_ID_VALUE_CLAIM = "value";
1920
export const USER_ROLES = "user-roles";
2021
const PURPOSE_ID_CLAIM = "purposeId";
21-
export const GENERATED_INTEROP_TOKEN_M2M_ROLE = "m2m";
2222
export const ROLE_CLAIM = "role";
2323

2424
export interface InteropJwtHeader {
@@ -37,43 +37,69 @@ export type InteropJwtCommonPayload = {
3737
exp: number;
3838
};
3939

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

47-
export type InteropJwtApiPayload = InteropJwtCommonPayload & {
50+
export type InteropConsumerToken = {
51+
header: InteropJwtHeader;
52+
payload: InteropJwtConsumerPayload;
53+
serialized: string;
54+
};
55+
56+
/* ==========================================
57+
Interop API Token
58+
========================================== */
59+
export type InteropJwtApiOrganizationClientPayload = InteropJwtCommonPayload & {
4860
client_id: ClientId;
4961
sub: ClientId;
5062
[ORGANIZATION_ID_CLAIM]: TenantId;
51-
[ROLE_CLAIM]: string;
5263
};
5364

54-
export type InteropJwtPayload = InteropJwtCommonPayload & {
55-
sub: string;
56-
role: string;
65+
export type InteropJwtApiM2MPayload = InteropJwtApiOrganizationClientPayload & {
66+
[ROLE_CLAIM]: Extract<SystemRole, "m2m">;
5767
};
5868

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

65-
export type InteropConsumerToken = {
66-
header: InteropJwtHeader;
67-
payload: InteropJwtConsumerPayload;
68-
serialized: string;
86+
/* ================================= =========
87+
Interop INTERNAL Token
88+
========================================== */
89+
export type InteropJwtPayload = InteropJwtCommonPayload & {
90+
sub: string;
91+
role: string;
6992
};
7093

71-
export type InteropApiToken = {
94+
export type InteropToken = {
7295
header: InteropJwtHeader;
73-
payload: InteropJwtApiPayload;
96+
payload: InteropJwtPayload;
7497
serialized: string;
7598
};
7699

100+
/* ==========================================
101+
Interop SESSION Token
102+
========================================== */
77103
const Organization = z.object({
78104
id: z.string(),
79105
name: z.string(),

0 commit comments

Comments
 (0)