@maronn-openid-connect/experimental 0.0.4 → 0.0.6
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/README.md +1 -0
- package/dist/device-authorization-grant/verification.d.ts.map +1 -1
- package/dist/device-authorization-grant/verification.js.map +1 -1
- package/dist/id-jag/errors.d.ts +11 -0
- package/dist/id-jag/errors.d.ts.map +1 -0
- package/dist/id-jag/errors.js +19 -0
- package/dist/id-jag/errors.js.map +1 -0
- package/dist/id-jag/index.d.ts +4 -0
- package/dist/id-jag/index.d.ts.map +1 -0
- package/dist/id-jag/index.js +4 -0
- package/dist/id-jag/index.js.map +1 -0
- package/dist/id-jag/issue-id-jag.d.ts +138 -0
- package/dist/id-jag/issue-id-jag.d.ts.map +1 -0
- package/dist/id-jag/issue-id-jag.js +359 -0
- package/dist/id-jag/issue-id-jag.js.map +1 -0
- package/dist/id-jag/redeem-id-jag.d.ts +65 -0
- package/dist/id-jag/redeem-id-jag.d.ts.map +1 -0
- package/dist/id-jag/redeem-id-jag.js +305 -0
- package/dist/id-jag/redeem-id-jag.js.map +1 -0
- package/dist/token-exchange/index.d.ts +1 -1
- package/dist/token-exchange/index.d.ts.map +1 -1
- package/dist/token-exchange/index.js +1 -1
- package/dist/token-exchange/index.js.map +1 -1
- package/dist/token-exchange/token-exchange-request.d.ts +19 -0
- package/dist/token-exchange/token-exchange-request.d.ts.map +1 -1
- package/dist/token-exchange/token-exchange-request.js +52 -14
- package/dist/token-exchange/token-exchange-request.js.map +1 -1
- package/package.json +8 -4
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { type AccessTokenInfo, type JwkSet, type TokenClientInfo } from '@maronn-openid-connect/core';
|
|
2
|
+
import { type IdJagActor } from './issue-id-jag.js';
|
|
3
|
+
export declare const JWT_BEARER_GRANT_TYPE = "urn:ietf:params:oauth:grant-type:jwt-bearer";
|
|
4
|
+
export declare const DEFAULT_ASSERTION_CLOCK_SKEW_SEC = 60;
|
|
5
|
+
export interface IdJagTrustedIdentityProvider {
|
|
6
|
+
issuer: string;
|
|
7
|
+
jwks: JwkSet;
|
|
8
|
+
}
|
|
9
|
+
export interface ParsedIdJagRedemptionParams {
|
|
10
|
+
assertion: string;
|
|
11
|
+
scope?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface IdJagAssertionPayload {
|
|
14
|
+
iss: string;
|
|
15
|
+
sub: string;
|
|
16
|
+
aud: string | string[];
|
|
17
|
+
client_id: string;
|
|
18
|
+
jti: string;
|
|
19
|
+
exp: number;
|
|
20
|
+
iat: number;
|
|
21
|
+
scope?: string;
|
|
22
|
+
resource?: string | string[];
|
|
23
|
+
auth_time?: number;
|
|
24
|
+
acr?: string;
|
|
25
|
+
amr?: string[];
|
|
26
|
+
act?: IdJagActor;
|
|
27
|
+
}
|
|
28
|
+
export interface IdJagRedemptionGrant {
|
|
29
|
+
subject: string;
|
|
30
|
+
clientId: string;
|
|
31
|
+
scope: string[];
|
|
32
|
+
requestedResources?: string[];
|
|
33
|
+
expiresIn: number;
|
|
34
|
+
idpIssuer: string;
|
|
35
|
+
jti: string;
|
|
36
|
+
authTime?: number;
|
|
37
|
+
acr?: string;
|
|
38
|
+
amr?: string[];
|
|
39
|
+
actor?: IdJagActor;
|
|
40
|
+
}
|
|
41
|
+
export type IdJagAccessTokenInfo = AccessTokenInfo & {
|
|
42
|
+
act?: IdJagActor;
|
|
43
|
+
};
|
|
44
|
+
export interface IdJagRedemptionContext {
|
|
45
|
+
params: Record<string, string>;
|
|
46
|
+
client: TokenClientInfo;
|
|
47
|
+
issuer: string;
|
|
48
|
+
identityProviders: IdJagTrustedIdentityProvider[];
|
|
49
|
+
configuredExpiresIn: number;
|
|
50
|
+
now?: Date;
|
|
51
|
+
clockSkewToleranceSec?: number;
|
|
52
|
+
}
|
|
53
|
+
export declare function authorizeIdJagRedemptionClient(client: TokenClientInfo): void;
|
|
54
|
+
export declare function parseIdJagRedemptionParams(params: Record<string, string>): ParsedIdJagRedemptionParams;
|
|
55
|
+
export declare function verifyIdJagAssertion(options: {
|
|
56
|
+
assertion: string;
|
|
57
|
+
issuer: string;
|
|
58
|
+
clientId: string;
|
|
59
|
+
identityProviders: IdJagTrustedIdentityProvider[];
|
|
60
|
+
now?: Date;
|
|
61
|
+
clockSkewToleranceSec?: number;
|
|
62
|
+
}): Promise<IdJagAssertionPayload>;
|
|
63
|
+
export declare function resolveIdJagGrantScope(requestedScope: string | undefined, assertionScope: string | undefined): string[];
|
|
64
|
+
export declare function processIdJagRedemptionRequest(context: IdJagRedemptionContext): Promise<IdJagRedemptionGrant>;
|
|
65
|
+
//# sourceMappingURL=redeem-id-jag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redeem-id-jag.d.ts","sourceRoot":"","sources":["../../src/id-jag/redeem-id-jag.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { extractAlgorithmParamsFromJwk, } from '@maronn-openid-connect/core';
|
|
2
|
+
import { ASSERTION_UNTRUSTED_DESCRIPTION, IdJagError, } from './errors.js';
|
|
3
|
+
import { ID_JAG_JWT_TYP } from './issue-id-jag.js';
|
|
4
|
+
export const JWT_BEARER_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:jwt-bearer';
|
|
5
|
+
export const DEFAULT_ASSERTION_CLOCK_SKEW_SEC = 60;
|
|
6
|
+
const FORBIDDEN_KEY_HEADERS = ['jku', 'x5u', 'jwk', 'x5c'];
|
|
7
|
+
export function authorizeIdJagRedemptionClient(client) {
|
|
8
|
+
const grantTypes = client.grantTypes ?? ['authorization_code'];
|
|
9
|
+
if (!grantTypes.includes(JWT_BEARER_GRANT_TYPE)) {
|
|
10
|
+
throw new IdJagError('unauthorized_client', 'The client is not authorized to use the jwt-bearer grant type');
|
|
11
|
+
}
|
|
12
|
+
if (client.tokenEndpointAuthMethod === 'none') {
|
|
13
|
+
throw new IdJagError('unauthorized_client', 'Public clients are not allowed to use the jwt-bearer grant type');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function parseIdJagRedemptionParams(params) {
|
|
17
|
+
const assertion = optional(params['assertion']);
|
|
18
|
+
if (assertion === undefined) {
|
|
19
|
+
throw new IdJagError('invalid_request', 'assertion is required');
|
|
20
|
+
}
|
|
21
|
+
if (optional(params['authorization_details']) !== undefined) {
|
|
22
|
+
throw new IdJagError('invalid_request', 'authorization_details is not supported for the jwt-bearer grant');
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
assertion,
|
|
26
|
+
scope: optional(params['scope']),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export async function verifyIdJagAssertion(options) {
|
|
30
|
+
const leeway = options.clockSkewToleranceSec ?? DEFAULT_ASSERTION_CLOCK_SKEW_SEC;
|
|
31
|
+
const parts = options.assertion.split('.');
|
|
32
|
+
if (parts.length !== 3) {
|
|
33
|
+
throw invalidAssertion('The provided assertion is not a valid JWS compact serialization');
|
|
34
|
+
}
|
|
35
|
+
const [headerB64, payloadB64, signatureB64] = parts;
|
|
36
|
+
let header;
|
|
37
|
+
let payload;
|
|
38
|
+
try {
|
|
39
|
+
header = parseBase64UrlJson(headerB64);
|
|
40
|
+
payload = parseBase64UrlJson(payloadB64);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
throw invalidAssertion('The provided assertion is not a valid JWS compact serialization');
|
|
44
|
+
}
|
|
45
|
+
if (!isIdJagTyp(header['typ'])) {
|
|
46
|
+
throw invalidAssertion(`The assertion typ must be ${ID_JAG_JWT_TYP}`);
|
|
47
|
+
}
|
|
48
|
+
const headerAlg = typeof header['alg'] === 'string' ? header['alg'] : undefined;
|
|
49
|
+
if (!headerAlg || headerAlg === 'none') {
|
|
50
|
+
throw invalidAssertion('The assertion alg is missing or "none"');
|
|
51
|
+
}
|
|
52
|
+
for (const field of FORBIDDEN_KEY_HEADERS) {
|
|
53
|
+
if (field in header) {
|
|
54
|
+
throw invalidAssertion(`The assertion JOSE header contains unsupported field: ${field}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const iss = payload['iss'];
|
|
58
|
+
if (typeof iss !== 'string' || iss.length === 0) {
|
|
59
|
+
throw invalidAssertion(ASSERTION_UNTRUSTED_DESCRIPTION);
|
|
60
|
+
}
|
|
61
|
+
if (iss === options.issuer) {
|
|
62
|
+
throw invalidAssertion('An assertion issued by this authorization server cannot be redeemed here');
|
|
63
|
+
}
|
|
64
|
+
const identityProvider = options.identityProviders.find((idp) => idp.issuer === iss);
|
|
65
|
+
if (identityProvider === undefined) {
|
|
66
|
+
throw invalidAssertion(ASSERTION_UNTRUSTED_DESCRIPTION);
|
|
67
|
+
}
|
|
68
|
+
const headerKid = typeof header['kid'] === 'string' ? header['kid'] : undefined;
|
|
69
|
+
const candidates = headerKid
|
|
70
|
+
? identityProvider.jwks.keys.filter((key) => key.kid === headerKid)
|
|
71
|
+
: identityProvider.jwks.keys.filter((key) => key.alg === headerAlg);
|
|
72
|
+
const signingInput = `${headerB64}.${payloadB64}`;
|
|
73
|
+
let signatureValid = false;
|
|
74
|
+
for (const jwk of candidates) {
|
|
75
|
+
if (jwk.alg !== headerAlg) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (await verifySignature(signingInput, signatureB64, jwk)) {
|
|
79
|
+
signatureValid = true;
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (!signatureValid) {
|
|
84
|
+
throw invalidAssertion(ASSERTION_UNTRUSTED_DESCRIPTION);
|
|
85
|
+
}
|
|
86
|
+
const aud = payload['aud'];
|
|
87
|
+
const audMatches = aud === options.issuer ||
|
|
88
|
+
(Array.isArray(aud) && aud.length === 1 && aud[0] === options.issuer);
|
|
89
|
+
if (!audMatches) {
|
|
90
|
+
throw invalidAssertion('The assertion audience does not match this authorization server');
|
|
91
|
+
}
|
|
92
|
+
const nowSeconds = Math.floor((options.now ?? new Date()).getTime() / 1000);
|
|
93
|
+
const exp = payload['exp'];
|
|
94
|
+
if (typeof exp !== 'number') {
|
|
95
|
+
throw invalidAssertion('The assertion is missing an exp claim');
|
|
96
|
+
}
|
|
97
|
+
if (exp + leeway < nowSeconds) {
|
|
98
|
+
throw invalidAssertion('The assertion has expired');
|
|
99
|
+
}
|
|
100
|
+
const iat = payload['iat'];
|
|
101
|
+
if (typeof iat !== 'number') {
|
|
102
|
+
throw invalidAssertion('The assertion is missing an iat claim');
|
|
103
|
+
}
|
|
104
|
+
if (iat > nowSeconds + leeway) {
|
|
105
|
+
throw invalidAssertion('The assertion iat is in the future');
|
|
106
|
+
}
|
|
107
|
+
const nbf = payload['nbf'];
|
|
108
|
+
if (nbf !== undefined) {
|
|
109
|
+
if (typeof nbf !== 'number' || nbf > nowSeconds + leeway) {
|
|
110
|
+
throw invalidAssertion('The assertion is not yet valid');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const jti = payload['jti'];
|
|
114
|
+
if (typeof jti !== 'string' || jti.length === 0) {
|
|
115
|
+
throw invalidAssertion('The assertion is missing a jti claim');
|
|
116
|
+
}
|
|
117
|
+
const sub = payload['sub'];
|
|
118
|
+
if (typeof sub !== 'string' || sub.length === 0) {
|
|
119
|
+
throw invalidAssertion('The assertion is missing a sub claim');
|
|
120
|
+
}
|
|
121
|
+
const clientId = payload['client_id'];
|
|
122
|
+
if (typeof clientId !== 'string' || clientId.length === 0) {
|
|
123
|
+
throw invalidAssertion('The assertion is missing a client_id claim');
|
|
124
|
+
}
|
|
125
|
+
if (clientId !== options.clientId) {
|
|
126
|
+
throw invalidAssertion('The assertion client_id does not match the authenticated client');
|
|
127
|
+
}
|
|
128
|
+
const scope = payload['scope'];
|
|
129
|
+
if (scope !== undefined && typeof scope !== 'string') {
|
|
130
|
+
throw invalidAssertion('The assertion scope claim must be a string');
|
|
131
|
+
}
|
|
132
|
+
const resource = payload['resource'];
|
|
133
|
+
if (resource !== undefined &&
|
|
134
|
+
typeof resource !== 'string' &&
|
|
135
|
+
!(Array.isArray(resource) && resource.every((value) => typeof value === 'string'))) {
|
|
136
|
+
throw invalidAssertion('The assertion resource claim must be a string or an array of strings');
|
|
137
|
+
}
|
|
138
|
+
const authTime = typeof payload['auth_time'] === 'number' ? payload['auth_time'] : undefined;
|
|
139
|
+
const acr = typeof payload['acr'] === 'string' ? payload['acr'] : undefined;
|
|
140
|
+
const amr = Array.isArray(payload['amr']) && payload['amr'].every((value) => typeof value === 'string')
|
|
141
|
+
? payload['amr']
|
|
142
|
+
: undefined;
|
|
143
|
+
const act = payload['act'];
|
|
144
|
+
if (act !== undefined && !isValidActorChain(act)) {
|
|
145
|
+
throw invalidAssertion('The assertion act claim is malformed');
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
iss,
|
|
149
|
+
sub,
|
|
150
|
+
aud: aud,
|
|
151
|
+
client_id: clientId,
|
|
152
|
+
jti,
|
|
153
|
+
exp,
|
|
154
|
+
iat,
|
|
155
|
+
...(scope === undefined ? {} : { scope }),
|
|
156
|
+
...(resource === undefined ? {} : { resource: resource }),
|
|
157
|
+
...(authTime === undefined ? {} : { auth_time: authTime }),
|
|
158
|
+
...(acr === undefined ? {} : { acr }),
|
|
159
|
+
...(amr === undefined ? {} : { amr }),
|
|
160
|
+
...(act === undefined ? {} : { act: act }),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
export function resolveIdJagGrantScope(requestedScope, assertionScope) {
|
|
164
|
+
const granted = splitScope(assertionScope).filter((value) => value !== 'offline_access');
|
|
165
|
+
const requested = splitScope(requestedScope);
|
|
166
|
+
if (requested.length === 0) {
|
|
167
|
+
return granted;
|
|
168
|
+
}
|
|
169
|
+
for (const value of requested) {
|
|
170
|
+
if (!granted.includes(value)) {
|
|
171
|
+
throw new IdJagError('invalid_scope', 'The requested scope exceeds the scope of the assertion');
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return requested;
|
|
175
|
+
}
|
|
176
|
+
export async function processIdJagRedemptionRequest(context) {
|
|
177
|
+
if (!Number.isInteger(context.configuredExpiresIn) || context.configuredExpiresIn <= 0) {
|
|
178
|
+
throw new RangeError(`configuredExpiresIn must be a positive integer, received ${context.configuredExpiresIn}`);
|
|
179
|
+
}
|
|
180
|
+
authorizeIdJagRedemptionClient(context.client);
|
|
181
|
+
const parsed = parseIdJagRedemptionParams(context.params);
|
|
182
|
+
const assertion = await verifyIdJagAssertion({
|
|
183
|
+
assertion: parsed.assertion,
|
|
184
|
+
issuer: context.issuer,
|
|
185
|
+
clientId: context.client.clientId,
|
|
186
|
+
identityProviders: context.identityProviders,
|
|
187
|
+
...(context.now === undefined ? {} : { now: context.now }),
|
|
188
|
+
...(context.clockSkewToleranceSec === undefined
|
|
189
|
+
? {}
|
|
190
|
+
: { clockSkewToleranceSec: context.clockSkewToleranceSec }),
|
|
191
|
+
});
|
|
192
|
+
const scope = resolveIdJagGrantScope(parsed.scope, assertion.scope);
|
|
193
|
+
const requestedResources = assertion.resource === undefined
|
|
194
|
+
? undefined
|
|
195
|
+
: typeof assertion.resource === 'string'
|
|
196
|
+
? [assertion.resource]
|
|
197
|
+
: [...assertion.resource];
|
|
198
|
+
return {
|
|
199
|
+
subject: assertion.sub,
|
|
200
|
+
clientId: context.client.clientId,
|
|
201
|
+
scope,
|
|
202
|
+
...(requestedResources === undefined ? {} : { requestedResources }),
|
|
203
|
+
expiresIn: context.configuredExpiresIn,
|
|
204
|
+
idpIssuer: assertion.iss,
|
|
205
|
+
jti: assertion.jti,
|
|
206
|
+
...(assertion.auth_time === undefined ? {} : { authTime: assertion.auth_time }),
|
|
207
|
+
...(assertion.acr === undefined ? {} : { acr: assertion.acr }),
|
|
208
|
+
...(assertion.amr === undefined ? {} : { amr: assertion.amr }),
|
|
209
|
+
...(assertion.act === undefined ? {} : { actor: assertion.act }),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
function optional(value) {
|
|
213
|
+
if (value === undefined)
|
|
214
|
+
return undefined;
|
|
215
|
+
const trimmed = value.trim();
|
|
216
|
+
return trimmed.length === 0 ? undefined : trimmed;
|
|
217
|
+
}
|
|
218
|
+
function splitScope(scope) {
|
|
219
|
+
if (scope === undefined)
|
|
220
|
+
return [];
|
|
221
|
+
return [...new Set(scope.split(/\s+/).filter((value) => value.length > 0))];
|
|
222
|
+
}
|
|
223
|
+
function invalidAssertion(description) {
|
|
224
|
+
return new IdJagError('invalid_grant', description);
|
|
225
|
+
}
|
|
226
|
+
function isValidActorChain(value) {
|
|
227
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
const actor = value;
|
|
231
|
+
if (typeof actor.sub !== 'string' || actor.sub.length === 0) {
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
if (actor.act !== undefined && !isValidActorChain(actor.act)) {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
return true;
|
|
238
|
+
}
|
|
239
|
+
function isIdJagTyp(typ) {
|
|
240
|
+
if (typeof typ !== 'string')
|
|
241
|
+
return false;
|
|
242
|
+
const normalized = typ.toLowerCase();
|
|
243
|
+
return normalized === ID_JAG_JWT_TYP || normalized === `application/${ID_JAG_JWT_TYP}`;
|
|
244
|
+
}
|
|
245
|
+
function parseBase64UrlJson(segment) {
|
|
246
|
+
if (!/^[A-Za-z0-9_-]+$/.test(segment)) {
|
|
247
|
+
throw new Error('invalid base64url');
|
|
248
|
+
}
|
|
249
|
+
const base64 = segment.replace(/-/g, '+').replace(/_/g, '/');
|
|
250
|
+
const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);
|
|
251
|
+
const binary = atob(padded);
|
|
252
|
+
const bytes = new Uint8Array(binary.length);
|
|
253
|
+
for (let i = 0; i < binary.length; i++) {
|
|
254
|
+
bytes[i] = binary.charCodeAt(i);
|
|
255
|
+
}
|
|
256
|
+
const parsed = JSON.parse(new TextDecoder().decode(bytes));
|
|
257
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
258
|
+
throw new Error('not a JSON object');
|
|
259
|
+
}
|
|
260
|
+
return parsed;
|
|
261
|
+
}
|
|
262
|
+
function base64UrlToArrayBuffer(segment) {
|
|
263
|
+
if (!/^[A-Za-z0-9_-]*$/.test(segment)) {
|
|
264
|
+
throw new Error('invalid base64url');
|
|
265
|
+
}
|
|
266
|
+
const base64 = segment.replace(/-/g, '+').replace(/_/g, '/');
|
|
267
|
+
const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);
|
|
268
|
+
const binary = atob(padded);
|
|
269
|
+
const bytes = new Uint8Array(binary.length);
|
|
270
|
+
for (let i = 0; i < binary.length; i++) {
|
|
271
|
+
bytes[i] = binary.charCodeAt(i);
|
|
272
|
+
}
|
|
273
|
+
return bytes.buffer;
|
|
274
|
+
}
|
|
275
|
+
async function verifySignature(signingInput, signatureB64, jwk) {
|
|
276
|
+
let signature;
|
|
277
|
+
try {
|
|
278
|
+
signature = base64UrlToArrayBuffer(signatureB64);
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
try {
|
|
284
|
+
const algParams = extractAlgorithmParamsFromJwk(jwk);
|
|
285
|
+
const publicKey = await crypto.subtle.importKey('jwk', jwk, algParams, false, ['verify']);
|
|
286
|
+
const algorithm = publicKey.algorithm;
|
|
287
|
+
let verifyParams;
|
|
288
|
+
if (algorithm.name === 'RSASSA-PKCS1-v1_5') {
|
|
289
|
+
verifyParams = { name: 'RSASSA-PKCS1-v1_5' };
|
|
290
|
+
}
|
|
291
|
+
else if (algorithm.name === 'ECDSA' && 'namedCurve' in algorithm) {
|
|
292
|
+
const namedCurve = algorithm.namedCurve;
|
|
293
|
+
const hash = namedCurve === 'P-256' ? 'SHA-256' : namedCurve === 'P-384' ? 'SHA-384' : 'SHA-512';
|
|
294
|
+
verifyParams = { name: 'ECDSA', hash };
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
return await crypto.subtle.verify(verifyParams, publicKey, signature, new TextEncoder().encode(signingInput));
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=redeem-id-jag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redeem-id-jag.js","sourceRoot":"","sources":["../../src/id-jag/redeem-id-jag.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { SUBJECT_TOKEN_INVALID_DESCRIPTION, TOKEN_EXCHANGE_GRANT_TYPE, TOKEN_TYPE_ACCESS_TOKEN, TokenExchangeError, authorizeTokenExchangeClient, buildTokenExchangeResponse, computeExchangedTokenLifetime, parseTokenExchangeParams, processTokenExchangeRequest, resolveExchangeTarget, resolveSubjectToken, validateExchangeScope, type ParsedTokenExchangeParams, type TokenExchangeErrorCode, type TokenExchangeGrant, type TokenExchangeRequestContext, type TokenExchangeResponse, } from './token-exchange-request.js';
|
|
1
|
+
export { ACTOR_TOKEN_INVALID_DESCRIPTION, SUBJECT_TOKEN_INVALID_DESCRIPTION, TOKEN_EXCHANGE_GRANT_TYPE, TOKEN_TYPE_ACCESS_TOKEN, TokenExchangeError, authorizeTokenExchangeClient, buildTokenExchangeResponse, composeActClaim, computeExchangedTokenLifetime, parseTokenExchangeParams, processTokenExchangeRequest, resolveActorToken, resolveExchangeTarget, resolveSubjectToken, validateExchangeScope, type ExchangedAccessTokenInfo, type ParsedTokenExchangeParams, type TokenExchangeActor, type TokenExchangeErrorCode, type TokenExchangeGrant, type TokenExchangeRequestContext, type TokenExchangeResponse, } from './token-exchange-request.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/token-exchange/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/token-exchange/index.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,+BAA+B,EAC/B,iCAAiC,EACjC,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,4BAA4B,EAC5B,0BAA0B,EAC1B,eAAe,EACf,6BAA6B,EAC7B,wBAAwB,EACxB,2BAA2B,EAC3B,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,GAC3B,MAAM,6BAA6B,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { SUBJECT_TOKEN_INVALID_DESCRIPTION, TOKEN_EXCHANGE_GRANT_TYPE, TOKEN_TYPE_ACCESS_TOKEN, TokenExchangeError, authorizeTokenExchangeClient, buildTokenExchangeResponse, computeExchangedTokenLifetime, parseTokenExchangeParams, processTokenExchangeRequest, resolveExchangeTarget, resolveSubjectToken, validateExchangeScope, } from './token-exchange-request.js';
|
|
1
|
+
export { ACTOR_TOKEN_INVALID_DESCRIPTION, SUBJECT_TOKEN_INVALID_DESCRIPTION, TOKEN_EXCHANGE_GRANT_TYPE, TOKEN_TYPE_ACCESS_TOKEN, TokenExchangeError, authorizeTokenExchangeClient, buildTokenExchangeResponse, composeActClaim, computeExchangedTokenLifetime, parseTokenExchangeParams, processTokenExchangeRequest, resolveActorToken, resolveExchangeTarget, resolveSubjectToken, validateExchangeScope, } from './token-exchange-request.js';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/token-exchange/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/token-exchange/index.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,+BAA+B,EAC/B,iCAAiC,EACjC,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,4BAA4B,EAC5B,0BAA0B,EAC1B,eAAe,EACf,6BAA6B,EAC7B,wBAAwB,EACxB,2BAA2B,EAC3B,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,GAQtB,MAAM,6BAA6B,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { type AccessTokenInfo, type AccessTokenResolver, type TokenClientInfo }
|
|
|
2
2
|
export declare const TOKEN_EXCHANGE_GRANT_TYPE = "urn:ietf:params:oauth:grant-type:token-exchange";
|
|
3
3
|
export declare const TOKEN_TYPE_ACCESS_TOKEN = "urn:ietf:params:oauth:token-type:access_token";
|
|
4
4
|
export declare const SUBJECT_TOKEN_INVALID_DESCRIPTION = "The provided subject_token is not valid";
|
|
5
|
+
export declare const ACTOR_TOKEN_INVALID_DESCRIPTION = "The provided actor_token is not valid";
|
|
5
6
|
export type TokenExchangeErrorCode = 'invalid_request' | 'unauthorized_client' | 'invalid_scope' | 'invalid_target';
|
|
6
7
|
export declare class TokenExchangeError extends Error {
|
|
7
8
|
readonly code: TokenExchangeErrorCode;
|
|
@@ -9,11 +10,19 @@ export declare class TokenExchangeError extends Error {
|
|
|
9
10
|
constructor(code: TokenExchangeErrorCode, errorDescription: string);
|
|
10
11
|
get statusCode(): 400;
|
|
11
12
|
}
|
|
13
|
+
export interface TokenExchangeActor {
|
|
14
|
+
sub: string;
|
|
15
|
+
act?: TokenExchangeActor;
|
|
16
|
+
}
|
|
17
|
+
export type ExchangedAccessTokenInfo = AccessTokenInfo & {
|
|
18
|
+
act?: TokenExchangeActor;
|
|
19
|
+
};
|
|
12
20
|
export interface ParsedTokenExchangeParams {
|
|
13
21
|
subjectToken: string;
|
|
14
22
|
scope?: string;
|
|
15
23
|
audience?: string;
|
|
16
24
|
resource?: string;
|
|
25
|
+
actorToken?: string;
|
|
17
26
|
}
|
|
18
27
|
export interface TokenExchangeGrant {
|
|
19
28
|
subject: string;
|
|
@@ -22,6 +31,7 @@ export interface TokenExchangeGrant {
|
|
|
22
31
|
requestedAudience?: string[];
|
|
23
32
|
expiresIn: number;
|
|
24
33
|
grantId?: string;
|
|
34
|
+
actor?: TokenExchangeActor;
|
|
25
35
|
}
|
|
26
36
|
export interface TokenExchangeResponse {
|
|
27
37
|
access_token: string;
|
|
@@ -45,6 +55,15 @@ export declare function resolveSubjectToken(options: {
|
|
|
45
55
|
accessTokenResolver: AccessTokenResolver;
|
|
46
56
|
now?: Date;
|
|
47
57
|
}): Promise<AccessTokenInfo>;
|
|
58
|
+
export declare function resolveActorToken(options: {
|
|
59
|
+
actorToken: string;
|
|
60
|
+
accessTokenResolver: AccessTokenResolver;
|
|
61
|
+
now?: Date;
|
|
62
|
+
}): Promise<AccessTokenInfo>;
|
|
63
|
+
export declare function composeActClaim(options: {
|
|
64
|
+
actorSub: string;
|
|
65
|
+
subjectActChain?: TokenExchangeActor;
|
|
66
|
+
}): TokenExchangeActor;
|
|
48
67
|
export declare function validateExchangeScope(requestedScope: string | undefined, subjectScope: string[]): string[];
|
|
49
68
|
export declare function resolveExchangeTarget(options: {
|
|
50
69
|
audience?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-exchange-request.d.ts","sourceRoot":"","sources":["../../src/token-exchange/token-exchange-request.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"token-exchange-request.d.ts","sourceRoot":"","sources":["../../src/token-exchange/token-exchange-request.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { sanitizeErrorDescription, } from '@maronn-openid-connect/core';
|
|
|
2
2
|
export const TOKEN_EXCHANGE_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:token-exchange';
|
|
3
3
|
export const TOKEN_TYPE_ACCESS_TOKEN = 'urn:ietf:params:oauth:token-type:access_token';
|
|
4
4
|
export const SUBJECT_TOKEN_INVALID_DESCRIPTION = 'The provided subject_token is not valid';
|
|
5
|
+
export const ACTOR_TOKEN_INVALID_DESCRIPTION = 'The provided actor_token is not valid';
|
|
5
6
|
export class TokenExchangeError extends Error {
|
|
6
7
|
code;
|
|
7
8
|
errorDescription;
|
|
@@ -26,9 +27,6 @@ export function authorizeTokenExchangeClient(client) {
|
|
|
26
27
|
}
|
|
27
28
|
}
|
|
28
29
|
export function parseTokenExchangeParams(params) {
|
|
29
|
-
if (params['actor_token'] !== undefined || params['actor_token_type'] !== undefined) {
|
|
30
|
-
throw new TokenExchangeError('invalid_request', 'Delegation is not supported: actor_token and actor_token_type must not be present.');
|
|
31
|
-
}
|
|
32
30
|
const subjectToken = optional(params['subject_token']);
|
|
33
31
|
if (subjectToken === undefined) {
|
|
34
32
|
throw new TokenExchangeError('invalid_request', 'subject_token is required');
|
|
@@ -48,26 +46,36 @@ export function parseTokenExchangeParams(params) {
|
|
|
48
46
|
if (resource !== undefined && !isAbsoluteUriWithoutFragment(resource)) {
|
|
49
47
|
throw new TokenExchangeError('invalid_request', 'resource must be an absolute URI without a fragment component');
|
|
50
48
|
}
|
|
49
|
+
const actorToken = optional(params['actor_token']);
|
|
50
|
+
const actorTokenType = optional(params['actor_token_type']);
|
|
51
|
+
if (actorToken !== undefined && actorTokenType === undefined) {
|
|
52
|
+
throw new TokenExchangeError('invalid_request', 'actor_token_type is required when actor_token is present');
|
|
53
|
+
}
|
|
54
|
+
if (actorToken === undefined && actorTokenType !== undefined) {
|
|
55
|
+
throw new TokenExchangeError('invalid_request', 'actor_token_type must not be present without actor_token');
|
|
56
|
+
}
|
|
57
|
+
if (actorTokenType !== undefined && actorTokenType !== TOKEN_TYPE_ACCESS_TOKEN) {
|
|
58
|
+
throw new TokenExchangeError('invalid_request', `Unsupported actor_token_type. Only ${TOKEN_TYPE_ACCESS_TOKEN} is supported.`);
|
|
59
|
+
}
|
|
51
60
|
return {
|
|
52
61
|
subjectToken,
|
|
53
62
|
scope: optional(params['scope']),
|
|
54
63
|
audience: optional(params['audience']),
|
|
55
64
|
resource,
|
|
65
|
+
actorToken,
|
|
56
66
|
};
|
|
57
67
|
}
|
|
58
68
|
export async function resolveSubjectToken(options) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
if (info.nbf !== undefined && info.nbf > nowSeconds) {
|
|
68
|
-
throw invalidSubjectToken();
|
|
69
|
+
return resolveExchangeToken(options.subjectToken, options.accessTokenResolver, options.now, invalidSubjectToken);
|
|
70
|
+
}
|
|
71
|
+
export async function resolveActorToken(options) {
|
|
72
|
+
return resolveExchangeToken(options.actorToken, options.accessTokenResolver, options.now, invalidActorToken);
|
|
73
|
+
}
|
|
74
|
+
export function composeActClaim(options) {
|
|
75
|
+
if (options.subjectActChain === undefined) {
|
|
76
|
+
return { sub: options.actorSub };
|
|
69
77
|
}
|
|
70
|
-
return
|
|
78
|
+
return { sub: options.actorSub, act: options.subjectActChain };
|
|
71
79
|
}
|
|
72
80
|
export function validateExchangeScope(requestedScope, subjectScope) {
|
|
73
81
|
const requested = splitScope(requestedScope);
|
|
@@ -125,6 +133,18 @@ export async function processTokenExchangeRequest(context) {
|
|
|
125
133
|
accessTokenResolver: context.accessTokenResolver,
|
|
126
134
|
now: context.now,
|
|
127
135
|
});
|
|
136
|
+
let actor;
|
|
137
|
+
if (parsed.actorToken !== undefined) {
|
|
138
|
+
const actorInfo = await resolveActorToken({
|
|
139
|
+
actorToken: parsed.actorToken,
|
|
140
|
+
accessTokenResolver: context.accessTokenResolver,
|
|
141
|
+
now: context.now,
|
|
142
|
+
});
|
|
143
|
+
actor = composeActClaim({
|
|
144
|
+
actorSub: actorInfo.sub,
|
|
145
|
+
subjectActChain: subject.act,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
128
148
|
const scope = validateExchangeScope(parsed.scope, subject.scope);
|
|
129
149
|
const requestedAudience = resolveExchangeTarget({
|
|
130
150
|
audience: parsed.audience,
|
|
@@ -144,6 +164,7 @@ export async function processTokenExchangeRequest(context) {
|
|
|
144
164
|
requestedAudience,
|
|
145
165
|
expiresIn,
|
|
146
166
|
grantId: subject.grantId,
|
|
167
|
+
...(actor === undefined ? {} : { actor }),
|
|
147
168
|
};
|
|
148
169
|
}
|
|
149
170
|
function optional(value) {
|
|
@@ -163,6 +184,23 @@ function toEpochSeconds(now) {
|
|
|
163
184
|
function invalidSubjectToken() {
|
|
164
185
|
return new TokenExchangeError('invalid_request', SUBJECT_TOKEN_INVALID_DESCRIPTION);
|
|
165
186
|
}
|
|
187
|
+
function invalidActorToken() {
|
|
188
|
+
return new TokenExchangeError('invalid_request', ACTOR_TOKEN_INVALID_DESCRIPTION);
|
|
189
|
+
}
|
|
190
|
+
async function resolveExchangeToken(token, accessTokenResolver, now, invalidToken) {
|
|
191
|
+
const info = await accessTokenResolver.findAccessToken(token);
|
|
192
|
+
if (info === null) {
|
|
193
|
+
throw invalidToken();
|
|
194
|
+
}
|
|
195
|
+
const nowSeconds = toEpochSeconds(now);
|
|
196
|
+
if (info.expiresAt <= nowSeconds) {
|
|
197
|
+
throw invalidToken();
|
|
198
|
+
}
|
|
199
|
+
if (info.nbf !== undefined && info.nbf > nowSeconds) {
|
|
200
|
+
throw invalidToken();
|
|
201
|
+
}
|
|
202
|
+
return info;
|
|
203
|
+
}
|
|
166
204
|
function isAbsoluteUriWithoutFragment(value) {
|
|
167
205
|
if (value.includes('#'))
|
|
168
206
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-exchange-request.js","sourceRoot":"","sources":["../../src/token-exchange/token-exchange-request.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"token-exchange-request.js","sourceRoot":"","sources":["../../src/token-exchange/token-exchange-request.ts"],"names":[],"mappings":"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"}
|