@maronn-openid-connect/core 0.0.1

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.
Files changed (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +145 -0
  3. package/dist/access-token-issuer.d.ts +14 -0
  4. package/dist/access-token-issuer.d.ts.map +1 -0
  5. package/dist/access-token-issuer.js +32 -0
  6. package/dist/access-token-issuer.js.map +1 -0
  7. package/dist/access-token.d.ts +19 -0
  8. package/dist/access-token.d.ts.map +1 -0
  9. package/dist/access-token.js +46 -0
  10. package/dist/access-token.js.map +1 -0
  11. package/dist/auth-transaction.d.ts +86 -0
  12. package/dist/auth-transaction.d.ts.map +1 -0
  13. package/dist/auth-transaction.js +187 -0
  14. package/dist/auth-transaction.js.map +1 -0
  15. package/dist/authorization-code-grant.d.ts +15 -0
  16. package/dist/authorization-code-grant.d.ts.map +1 -0
  17. package/dist/authorization-code-grant.js +109 -0
  18. package/dist/authorization-code-grant.js.map +1 -0
  19. package/dist/authorization-code.d.ts +28 -0
  20. package/dist/authorization-code.d.ts.map +1 -0
  21. package/dist/authorization-code.js +41 -0
  22. package/dist/authorization-code.js.map +1 -0
  23. package/dist/authorization-request.d.ts +128 -0
  24. package/dist/authorization-request.d.ts.map +1 -0
  25. package/dist/authorization-request.js +457 -0
  26. package/dist/authorization-request.js.map +1 -0
  27. package/dist/client-auth.d.ts +16 -0
  28. package/dist/client-auth.d.ts.map +1 -0
  29. package/dist/client-auth.js +116 -0
  30. package/dist/client-auth.js.map +1 -0
  31. package/dist/crypto-utils.d.ts +18 -0
  32. package/dist/crypto-utils.d.ts.map +1 -0
  33. package/dist/crypto-utils.js +197 -0
  34. package/dist/crypto-utils.js.map +1 -0
  35. package/dist/discovery.d.ts +56 -0
  36. package/dist/discovery.d.ts.map +1 -0
  37. package/dist/discovery.js +133 -0
  38. package/dist/discovery.js.map +1 -0
  39. package/dist/error-utils.d.ts +2 -0
  40. package/dist/error-utils.d.ts.map +1 -0
  41. package/dist/error-utils.js +13 -0
  42. package/dist/error-utils.js.map +1 -0
  43. package/dist/id-token.d.ts +39 -0
  44. package/dist/id-token.d.ts.map +1 -0
  45. package/dist/id-token.js +193 -0
  46. package/dist/id-token.js.map +1 -0
  47. package/dist/index.d.ts +34 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +19 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/introspection.d.ts +66 -0
  52. package/dist/introspection.d.ts.map +1 -0
  53. package/dist/introspection.js +139 -0
  54. package/dist/introspection.js.map +1 -0
  55. package/dist/jwks.d.ts +29 -0
  56. package/dist/jwks.d.ts.map +1 -0
  57. package/dist/jwks.js +36 -0
  58. package/dist/jwks.js.map +1 -0
  59. package/dist/loopback.d.ts +2 -0
  60. package/dist/loopback.d.ts.map +1 -0
  61. package/dist/loopback.js +6 -0
  62. package/dist/loopback.js.map +1 -0
  63. package/dist/refresh-token-grant.d.ts +14 -0
  64. package/dist/refresh-token-grant.d.ts.map +1 -0
  65. package/dist/refresh-token-grant.js +87 -0
  66. package/dist/refresh-token-grant.js.map +1 -0
  67. package/dist/request-object.d.ts +11 -0
  68. package/dist/request-object.d.ts.map +1 -0
  69. package/dist/request-object.js +92 -0
  70. package/dist/request-object.js.map +1 -0
  71. package/dist/revocation.d.ts +51 -0
  72. package/dist/revocation.d.ts.map +1 -0
  73. package/dist/revocation.js +93 -0
  74. package/dist/revocation.js.map +1 -0
  75. package/dist/signing-key.d.ts +21 -0
  76. package/dist/signing-key.d.ts.map +1 -0
  77. package/dist/signing-key.js +99 -0
  78. package/dist/signing-key.js.map +1 -0
  79. package/dist/token-error.d.ts +16 -0
  80. package/dist/token-error.d.ts.map +1 -0
  81. package/dist/token-error.js +31 -0
  82. package/dist/token-error.js.map +1 -0
  83. package/dist/token-request.d.ts +111 -0
  84. package/dist/token-request.d.ts.map +1 -0
  85. package/dist/token-request.js +44 -0
  86. package/dist/token-request.js.map +1 -0
  87. package/dist/token-response.d.ts +111 -0
  88. package/dist/token-response.d.ts.map +1 -0
  89. package/dist/token-response.js +173 -0
  90. package/dist/token-response.js.map +1 -0
  91. package/dist/userinfo.d.ts +98 -0
  92. package/dist/userinfo.d.ts.map +1 -0
  93. package/dist/userinfo.js +188 -0
  94. package/dist/userinfo.js.map +1 -0
  95. package/package.json +52 -0
@@ -0,0 +1,111 @@
1
+ export { TokenError, TokenErrorCode } from './token-error.js';
2
+ export { buildValidatedAuthorizationCodeRequest, consumeAuthorizationCode, resolveAuthorizationCode, validateAuthorizationCodeClient, validateAuthorizationCodeExpiration, validateAuthorizationCodeGrant, validateAuthorizationCodeRedirectUri, validateAuthorizationCodeUnused, verifyAuthorizationCodePkce, } from './authorization-code-grant.js';
3
+ export { buildValidatedRefreshTokenRequest, resolveRefreshToken, validateRefreshTokenClient, validateRefreshTokenExpiration, validateRefreshTokenGrant, validateRefreshTokenIdleTimeout, validateRefreshTokenScope, validateRefreshTokenUnused, } from './refresh-token-grant.js';
4
+ export type { ResolvedAuthorizationCode, } from './authorization-code-grant.js';
5
+ export type { ResolvedRefreshToken, } from './refresh-token-grant.js';
6
+ export interface TokenRequestParams {
7
+ grant_type: string;
8
+ code?: string;
9
+ redirect_uri?: string;
10
+ code_verifier?: string;
11
+ client_id?: string;
12
+ client_secret?: string;
13
+ refresh_token?: string;
14
+ scope?: string;
15
+ }
16
+ export interface TokenClientInfo {
17
+ clientId: string;
18
+ clientSecret?: string;
19
+ grantTypes?: string[];
20
+ tokenEndpointAuthMethod?: 'client_secret_basic' | 'client_secret_post' | 'none';
21
+ }
22
+ export interface TokenClientResolver {
23
+ findClient(clientId: string): Promise<TokenClientInfo | null>;
24
+ }
25
+ export interface AuthorizationCodeInfo {
26
+ code: string;
27
+ grantId: string;
28
+ clientId: string;
29
+ redirectUri: string;
30
+ redirectUriExplicit: boolean;
31
+ scope: string[];
32
+ codeChallenge?: string;
33
+ codeChallengeMethod?: 'S256';
34
+ expiresAt: number;
35
+ used: boolean;
36
+ nonce?: string;
37
+ audience?: string[];
38
+ acrValues?: string;
39
+ claims?: import('./userinfo.js').ClaimsParameter;
40
+ }
41
+ export interface AuthorizationCodeResolver {
42
+ findAuthorizationCode(code: string): Promise<AuthorizationCodeInfo | null>;
43
+ revokeAuthorizationCode(code: string): Promise<void>;
44
+ revokeTokensByGrantId?(grantId: string): Promise<void>;
45
+ }
46
+ export interface RefreshTokenInfo {
47
+ subject: string;
48
+ clientId: string;
49
+ scope: string[];
50
+ expiresAt: number;
51
+ used: boolean;
52
+ grantId: string;
53
+ iat?: number;
54
+ originalIssuedAt: number;
55
+ issuer?: string;
56
+ lastUsedAt?: number;
57
+ audience?: string[];
58
+ authTime: number;
59
+ nonce?: string;
60
+ acr?: string;
61
+ amr?: string[];
62
+ azp?: string;
63
+ }
64
+ export interface RefreshTokenResolver {
65
+ resolve(token: string): Promise<RefreshTokenInfo | null>;
66
+ revokeRefreshToken(token: string): Promise<void>;
67
+ revokeTokensByGrantId?(grantId: string): Promise<void>;
68
+ }
69
+ export interface TokenRequestContext {
70
+ params: TokenRequestParams;
71
+ clientResolver: TokenClientResolver;
72
+ authCodeResolver: AuthorizationCodeResolver;
73
+ authenticatedClientId: string;
74
+ refreshTokenResolver?: RefreshTokenResolver;
75
+ supportedGrantTypes?: string[];
76
+ refreshTokenIdleTimeoutSeconds?: number;
77
+ }
78
+ export interface ValidatedAuthorizationCodeRequest {
79
+ grantType: 'authorization_code';
80
+ clientId: string;
81
+ code: string;
82
+ grantId: string;
83
+ redirectUri: string;
84
+ scope: string[];
85
+ nonce?: string;
86
+ audience?: string[];
87
+ acrValues?: string;
88
+ claims?: import('./userinfo.js').ClaimsParameter;
89
+ codeVerified: boolean;
90
+ }
91
+ export interface ValidatedRefreshTokenRequest {
92
+ grantType: 'refresh_token';
93
+ clientId: string;
94
+ subject: string;
95
+ scope: string[];
96
+ grantId: string;
97
+ audience?: string[];
98
+ authTime: number;
99
+ nonce?: string;
100
+ acr?: string;
101
+ amr?: string[];
102
+ azp?: string;
103
+ originalIssuedAt: number;
104
+ hadOfflineAccess: boolean;
105
+ }
106
+ export type ValidatedTokenRequest = ValidatedAuthorizationCodeRequest | ValidatedRefreshTokenRequest;
107
+ export declare function validateGrantTypeSupported(grantType: string | undefined, supportedGrantTypes?: string[]): 'authorization_code' | 'refresh_token';
108
+ export declare function resolveAuthenticatedTokenClient(authenticatedClientId: string, clientResolver: TokenClientResolver): Promise<TokenClientInfo>;
109
+ export declare function validateClientGrantType(client: TokenClientInfo, grantType: string): void;
110
+ export declare function validateTokenRequest(context: TokenRequestContext): Promise<ValidatedTokenRequest>;
111
+ //# sourceMappingURL=token-request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-request.d.ts","sourceRoot":"","sources":["../src/token-request.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EACL,sCAAsC,EACtC,wBAAwB,EACxB,wBAAwB,EACxB,+BAA+B,EAC/B,mCAAmC,EACnC,8BAA8B,EAC9B,oCAAoC,EACpC,+BAA+B,EAC/B,2BAA2B,GAC5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,iCAAiC,EACjC,mBAAmB,EACnB,0BAA0B,EAC1B,8BAA8B,EAC9B,yBAAyB,EACzB,+BAA+B,EAC/B,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,yBAAyB,GAC1B,MAAM,+BAA+B,CAAC;AACvC,YAAY,EACV,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAUlC,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IAMjB,YAAY,CAAC,EAAE,MAAM,CAAC;IAOtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAOtB,uBAAuB,CAAC,EAAE,qBAAqB,GAAG,oBAAoB,GAAG,MAAM,CAAC;CACjF;AAKD,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;CAC/D;AAKD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IAKb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IAMpB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAKpB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,MAAM,CAAC,EAAE,OAAO,eAAe,EAAE,eAAe,CAAC;CAClD;AAKD,MAAM,WAAW,yBAAyB;IACxC,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;IAqB3E,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAMrD,qBAAqB,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAaD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IAKd,OAAO,EAAE,MAAM,CAAC;IAEhB,GAAG,CAAC,EAAE,MAAM,CAAC;IAOb,gBAAgB,EAAE,MAAM,CAAC;IAEzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAOhB,UAAU,CAAC,EAAE,MAAM,CAAC;IAMpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAKpB,QAAQ,EAAE,MAAM,CAAC;IASjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAMf,GAAG,CAAC,EAAE,MAAM,CAAC;IAMb,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IAKf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAKD,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAmBzD,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAQjD,qBAAqB,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAYD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,cAAc,EAAE,mBAAmB,CAAC;IACpC,gBAAgB,EAAE,yBAAyB,CAAC;IAE5C,qBAAqB,EAAE,MAAM,CAAC;IAE9B,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAQ5C,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAU/B,8BAA8B,CAAC,EAAE,MAAM,CAAC;CACzC;AAKD,MAAM,WAAW,iCAAiC;IAChD,SAAS,EAAE,oBAAoB,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IAEb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAMpB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,MAAM,CAAC,EAAE,OAAO,eAAe,EAAE,eAAe,CAAC;IACjD,YAAY,EAAE,OAAO,CAAC;CACvB;AASD,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,eAAe,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB,OAAO,EAAE,MAAM,CAAC;IAKhB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB,QAAQ,EAAE,MAAM,CAAC;IAEjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IAEf,GAAG,CAAC,EAAE,MAAM,CAAC;IAMb,gBAAgB,EAAE,MAAM,CAAC;IASzB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAKD,MAAM,MAAM,qBAAqB,GAAG,iCAAiC,GAAG,4BAA4B,CAAC;AAarG,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,mBAAmB,GAAE,MAAM,EAAuC,GACjE,oBAAoB,GAAG,eAAe,CAmBxC;AASD,wBAAsB,+BAA+B,CACnD,qBAAqB,EAAE,MAAM,EAC7B,cAAc,EAAE,mBAAmB,GAClC,OAAO,CAAC,eAAe,CAAC,CAiB1B;AAUD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,MAAM,GAChB,IAAI,CAQN;AAoBD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,qBAAqB,CAAC,CAsBhC"}
@@ -0,0 +1,44 @@
1
+ import { TokenError, TokenErrorCode } from './token-error.js';
2
+ import { validateAuthorizationCodeGrant } from './authorization-code-grant.js';
3
+ import { validateRefreshTokenGrant } from './refresh-token-grant.js';
4
+ export { TokenError, TokenErrorCode } from './token-error.js';
5
+ export { buildValidatedAuthorizationCodeRequest, consumeAuthorizationCode, resolveAuthorizationCode, validateAuthorizationCodeClient, validateAuthorizationCodeExpiration, validateAuthorizationCodeGrant, validateAuthorizationCodeRedirectUri, validateAuthorizationCodeUnused, verifyAuthorizationCodePkce, } from './authorization-code-grant.js';
6
+ export { buildValidatedRefreshTokenRequest, resolveRefreshToken, validateRefreshTokenClient, validateRefreshTokenExpiration, validateRefreshTokenGrant, validateRefreshTokenIdleTimeout, validateRefreshTokenScope, validateRefreshTokenUnused, } from './refresh-token-grant.js';
7
+ const DEFAULT_SUPPORTED_GRANT_TYPES = ['authorization_code', 'refresh_token'];
8
+ export function validateGrantTypeSupported(grantType, supportedGrantTypes = [...DEFAULT_SUPPORTED_GRANT_TYPES]) {
9
+ if (!grantType) {
10
+ throw new TokenError(TokenErrorCode.InvalidRequest, 'Missing required parameter: grant_type');
11
+ }
12
+ if ((grantType !== 'authorization_code' && grantType !== 'refresh_token') ||
13
+ !supportedGrantTypes.includes(grantType)) {
14
+ throw new TokenError(TokenErrorCode.UnsupportedGrantType, `Unsupported grant_type: ${grantType}`);
15
+ }
16
+ return grantType;
17
+ }
18
+ export async function resolveAuthenticatedTokenClient(authenticatedClientId, clientResolver) {
19
+ if (!authenticatedClientId) {
20
+ throw new TokenError(TokenErrorCode.InvalidClient, 'Client authentication required');
21
+ }
22
+ const client = await clientResolver.findClient(authenticatedClientId);
23
+ if (!client) {
24
+ throw new TokenError(TokenErrorCode.InvalidClient, 'Client authentication failed');
25
+ }
26
+ return client;
27
+ }
28
+ export function validateClientGrantType(client, grantType) {
29
+ const allowedGrantTypes = client.grantTypes ?? ['authorization_code'];
30
+ if (!allowedGrantTypes.includes(grantType)) {
31
+ throw new TokenError(TokenErrorCode.UnauthorizedClient, `Client is not authorized to use grant_type: ${grantType}`);
32
+ }
33
+ }
34
+ export async function validateTokenRequest(context) {
35
+ const { params, clientResolver, authenticatedClientId } = context;
36
+ const grantType = validateGrantTypeSupported(params.grant_type, context.supportedGrantTypes);
37
+ const client = await resolveAuthenticatedTokenClient(authenticatedClientId, clientResolver);
38
+ validateClientGrantType(client, grantType);
39
+ if (grantType === 'refresh_token') {
40
+ return validateRefreshTokenGrant(context);
41
+ }
42
+ return validateAuthorizationCodeGrant(context);
43
+ }
44
+ //# sourceMappingURL=token-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-request.js","sourceRoot":"","sources":["../src/token-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAIrE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EACL,sCAAsC,EACtC,wBAAwB,EACxB,wBAAwB,EACxB,+BAA+B,EAC/B,mCAAmC,EACnC,8BAA8B,EAC9B,oCAAoC,EACpC,+BAA+B,EAC/B,2BAA2B,GAC5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,iCAAiC,EACjC,mBAAmB,EACnB,0BAA0B,EAC1B,8BAA8B,EAC9B,yBAAyB,EACzB,+BAA+B,EAC/B,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,0BAA0B,CAAC;AA0PlC,MAAM,6BAA6B,GAAG,CAAC,oBAAoB,EAAE,eAAe,CAAU,CAAC;AAwHvF,MAAM,UAAU,0BAA0B,CACxC,SAA6B,EAC7B,sBAAgC,CAAC,GAAG,6BAA6B,CAAC;IAElE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,cAAc,EAC7B,wCAAwC,CACzC,CAAC;IACJ,CAAC;IAED,IACE,CAAC,SAAS,KAAK,oBAAoB,IAAI,SAAS,KAAK,eAAe,CAAC;QACrE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,EACxC,CAAC;QACD,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,oBAAoB,EACnC,2BAA2B,SAAS,EAAE,CACvC,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,qBAA6B,EAC7B,cAAmC;IAEnC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,aAAa,EAC5B,gCAAgC,CACjC,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,aAAa,EAC5B,8BAA8B,CAC/B,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAUD,MAAM,UAAU,uBAAuB,CACrC,MAAuB,EACvB,SAAiB;IAEjB,MAAM,iBAAiB,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACtE,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,kBAAkB,EACjC,+CAA+C,SAAS,EAAE,CAC3D,CAAC;IACJ,CAAC;AACH,CAAC;AAoBD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAA4B;IAE5B,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;IAGlE,MAAM,SAAS,GAAG,0BAA0B,CAC1C,MAAM,CAAC,UAAU,EACjB,OAAO,CAAC,mBAAmB,CAC5B,CAAC;IAGF,MAAM,MAAM,GAAG,MAAM,+BAA+B,CAClD,qBAAqB,EACrB,cAAc,CACf,CAAC;IACF,uBAAuB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAG3C,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;QAClC,OAAO,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,8BAA8B,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,111 @@
1
+ import type { IdTokenPayload } from './id-token.js';
2
+ import type { AccessTokenIssuer } from './access-token-issuer.js';
3
+ import type { AccessTokenPayload } from './access-token.js';
4
+ import type { UserClaims, ClaimsParameter } from './userinfo.js';
5
+ export type AcrResolver = (context: {
6
+ userId: string;
7
+ clientId: string;
8
+ requestedAcrValues?: string;
9
+ }) => Promise<{
10
+ acr: string;
11
+ amr: string[];
12
+ } | undefined>;
13
+ export interface TokenResponseOptions {
14
+ issuer: string;
15
+ subject: string;
16
+ clientId: string;
17
+ scope: string[];
18
+ privateKey: CryptoKey;
19
+ accessTokenExpiresIn: number;
20
+ idTokenExpiresIn: number;
21
+ keyId?: string;
22
+ idTokenPrivateKey?: CryptoKey;
23
+ idTokenKeyId?: string;
24
+ nonce?: string;
25
+ authTime?: number;
26
+ audience?: string[];
27
+ idTokenAudiences?: string[];
28
+ issueRefreshToken?: boolean;
29
+ refreshTokenExpiresIn?: number;
30
+ accessTokenIssuer?: AccessTokenIssuer;
31
+ issueIdToken?: boolean;
32
+ acrResolver?: AcrResolver;
33
+ requestedAcrValues?: string;
34
+ acr?: string;
35
+ amr?: string[];
36
+ userClaims?: UserClaims;
37
+ claims?: ClaimsParameter;
38
+ }
39
+ export interface TokenResponse {
40
+ access_token: string;
41
+ token_type: 'Bearer';
42
+ expires_in: number;
43
+ id_token?: string;
44
+ scope: string;
45
+ refresh_token?: string;
46
+ }
47
+ export interface GenerateTokenResponseResult {
48
+ response: TokenResponse;
49
+ resolvedAcr?: string;
50
+ resolvedAmr?: string[];
51
+ accessTokenJti?: string;
52
+ }
53
+ export interface AccessTokenAudienceInput {
54
+ userInfoEndpoint?: string;
55
+ requested?: string[];
56
+ issuer: string;
57
+ }
58
+ export declare function buildAccessTokenAudience(input: AccessTokenAudienceInput): string[];
59
+ export interface IdTokenAudienceInput {
60
+ clientId: string;
61
+ additional?: string[];
62
+ }
63
+ export interface IdTokenAudienceResult {
64
+ aud: string | string[];
65
+ azp?: string;
66
+ }
67
+ export declare function buildIdTokenAudience(input: IdTokenAudienceInput): IdTokenAudienceResult;
68
+ export interface AccessTokenPayloadInput {
69
+ issuer: string;
70
+ subject: string;
71
+ clientId: string;
72
+ scope: string[];
73
+ audience?: string[];
74
+ expiresIn: number;
75
+ issuedAt?: number;
76
+ jti?: string;
77
+ }
78
+ export declare function buildAccessTokenPayload(input: AccessTokenPayloadInput): AccessTokenPayload;
79
+ export declare function computeAtHash(accessToken: string, idTokenPrivateKey: CryptoKey): Promise<string>;
80
+ export interface ResolveAcrAmrInput {
81
+ subject: string;
82
+ clientId: string;
83
+ acr?: string;
84
+ amr?: string[];
85
+ requestedAcrValues?: string;
86
+ claims?: ClaimsParameter;
87
+ acrResolver?: AcrResolver;
88
+ }
89
+ export interface ResolvedAcrAmr {
90
+ acr?: string;
91
+ amr?: string[];
92
+ }
93
+ export declare function resolveAcrAmr(input: ResolveAcrAmrInput): Promise<ResolvedAcrAmr>;
94
+ export interface IdTokenPayloadInput {
95
+ issuer: string;
96
+ subject: string;
97
+ clientId: string;
98
+ scope: string[];
99
+ expiresIn: number;
100
+ issuedAt?: number;
101
+ atHash?: string;
102
+ nonce?: string;
103
+ authTime?: number;
104
+ acr?: string;
105
+ amr?: string[];
106
+ idTokenAudiences?: string[];
107
+ userClaims?: UserClaims;
108
+ }
109
+ export declare function buildIdTokenPayload(input: IdTokenPayloadInput): IdTokenPayload;
110
+ export declare function generateTokenResponse(options: TokenResponseOptions): Promise<GenerateTokenResponseResult>;
111
+ //# sourceMappingURL=token-response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-response.d.ts","sourceRoot":"","sources":["../src/token-response.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,173 @@
1
+ import { generateIdToken } from './id-token.js';
2
+ import { arrayBufferToBase64Url, stringToArrayBuffer, generateRandomString, getJwaAlgorithm, jwaToHashName } from './crypto-utils.js';
3
+ import { createJwtAccessTokenIssuer } from './access-token-issuer.js';
4
+ import { filterClaimsByScope } from './userinfo.js';
5
+ export function buildAccessTokenAudience(input) {
6
+ const { userInfoEndpoint, requested, issuer } = input;
7
+ const members = [];
8
+ if (userInfoEndpoint) {
9
+ members.push(userInfoEndpoint);
10
+ }
11
+ if (requested) {
12
+ members.push(...requested);
13
+ }
14
+ const deduped = [...new Set(members)];
15
+ return deduped.length > 0 ? deduped : [issuer];
16
+ }
17
+ export function buildIdTokenAudience(input) {
18
+ const { clientId, additional } = input;
19
+ const deduped = [...new Set([clientId, ...(additional ?? [])])];
20
+ if (deduped.length <= 1) {
21
+ return { aud: clientId };
22
+ }
23
+ return { aud: deduped, azp: clientId };
24
+ }
25
+ export function buildAccessTokenPayload(input) {
26
+ const { issuer, subject, clientId, scope, audience, expiresIn } = input;
27
+ const issuedAt = input.issuedAt ?? Math.floor(Date.now() / 1000);
28
+ return {
29
+ iss: issuer,
30
+ sub: subject,
31
+ aud: buildAccessTokenAudience({ requested: audience, issuer }),
32
+ exp: issuedAt + expiresIn,
33
+ iat: issuedAt,
34
+ jti: input.jti ?? generateRandomString(16),
35
+ scope: scope.join(' '),
36
+ client_id: clientId,
37
+ };
38
+ }
39
+ export async function computeAtHash(accessToken, idTokenPrivateKey) {
40
+ const hashName = jwaToHashName(getJwaAlgorithm(idTokenPrivateKey));
41
+ const tokenBytes = stringToArrayBuffer(accessToken);
42
+ const hashBuffer = await crypto.subtle.digest(hashName, tokenBytes);
43
+ const leftHalf = hashBuffer.slice(0, hashBuffer.byteLength / 2);
44
+ return arrayBufferToBase64Url(leftHalf);
45
+ }
46
+ export async function resolveAcrAmr(input) {
47
+ const { subject, clientId, acr, amr, requestedAcrValues, claims, acrResolver } = input;
48
+ if (acr !== undefined || amr !== undefined) {
49
+ return { acr, amr };
50
+ }
51
+ if (!acrResolver) {
52
+ return { acr: undefined, amr: undefined };
53
+ }
54
+ let effectiveRequestedAcrValues = requestedAcrValues;
55
+ if (effectiveRequestedAcrValues === undefined && claims?.id_token) {
56
+ const acrEntry = claims.id_token['acr'];
57
+ if (acrEntry && Array.isArray(acrEntry.values)) {
58
+ const stringValues = acrEntry.values.filter((v) => typeof v === 'string');
59
+ if (stringValues.length > 0) {
60
+ effectiveRequestedAcrValues = stringValues.join(' ');
61
+ }
62
+ }
63
+ }
64
+ const result = await acrResolver({
65
+ userId: subject,
66
+ clientId,
67
+ requestedAcrValues: effectiveRequestedAcrValues,
68
+ });
69
+ return { acr: result?.acr, amr: result?.amr };
70
+ }
71
+ export function buildIdTokenPayload(input) {
72
+ const { issuer, subject, clientId, scope, expiresIn, atHash, nonce, authTime, acr, amr, idTokenAudiences, userClaims, } = input;
73
+ const issuedAt = input.issuedAt ?? Math.floor(Date.now() / 1000);
74
+ const payload = {};
75
+ if (userClaims) {
76
+ Object.assign(payload, filterClaimsByScope(userClaims, scope));
77
+ }
78
+ payload.iss = issuer;
79
+ payload.sub = subject;
80
+ const { aud, azp } = buildIdTokenAudience({ clientId, additional: idTokenAudiences });
81
+ payload.aud = aud;
82
+ if (azp !== undefined) {
83
+ payload.azp = azp;
84
+ }
85
+ payload.exp = issuedAt + expiresIn;
86
+ payload.iat = issuedAt;
87
+ if (atHash !== undefined) {
88
+ payload.at_hash = atHash;
89
+ }
90
+ if (nonce !== undefined) {
91
+ payload.nonce = nonce;
92
+ }
93
+ if (authTime !== undefined) {
94
+ payload.auth_time = authTime;
95
+ }
96
+ if (acr !== undefined) {
97
+ payload.acr = acr;
98
+ }
99
+ if (amr !== undefined) {
100
+ payload.amr = amr;
101
+ }
102
+ return payload;
103
+ }
104
+ export async function generateTokenResponse(options) {
105
+ const { issuer, subject, clientId, scope, privateKey, accessTokenExpiresIn, idTokenExpiresIn, keyId, idTokenPrivateKey, idTokenKeyId, nonce, authTime, audience, idTokenAudiences, issueRefreshToken, accessTokenIssuer, issueIdToken = true, acrResolver, requestedAcrValues, acr: directAcr, amr: directAmr, userClaims, claims, } = options;
106
+ const idtKey = idTokenPrivateKey ?? privateKey;
107
+ const idtKid = idTokenKeyId ?? keyId;
108
+ const now = Math.floor(Date.now() / 1000);
109
+ const accessTokenPayload = buildAccessTokenPayload({
110
+ issuer,
111
+ subject,
112
+ clientId,
113
+ scope,
114
+ audience,
115
+ expiresIn: accessTokenExpiresIn,
116
+ issuedAt: now,
117
+ });
118
+ const issuerImpl = accessTokenIssuer ?? createJwtAccessTokenIssuer();
119
+ const accessToken = await issuerImpl.issue({
120
+ payload: accessTokenPayload,
121
+ privateKey,
122
+ keyId,
123
+ });
124
+ let idToken;
125
+ let resolvedAcr;
126
+ let resolvedAmr;
127
+ if (issueIdToken) {
128
+ const atHash = await computeAtHash(accessToken, idtKey);
129
+ ({ acr: resolvedAcr, amr: resolvedAmr } = await resolveAcrAmr({
130
+ subject,
131
+ clientId,
132
+ acr: directAcr,
133
+ amr: directAmr,
134
+ requestedAcrValues,
135
+ claims,
136
+ acrResolver,
137
+ }));
138
+ const idTokenPayload = buildIdTokenPayload({
139
+ issuer,
140
+ subject,
141
+ clientId,
142
+ scope,
143
+ expiresIn: idTokenExpiresIn,
144
+ issuedAt: now,
145
+ atHash,
146
+ nonce,
147
+ authTime,
148
+ acr: resolvedAcr,
149
+ amr: resolvedAmr,
150
+ idTokenAudiences,
151
+ userClaims,
152
+ });
153
+ idToken = await generateIdToken({
154
+ payload: idTokenPayload,
155
+ privateKey: idtKey,
156
+ keyId: idtKid,
157
+ });
158
+ }
159
+ return {
160
+ response: {
161
+ access_token: accessToken,
162
+ token_type: 'Bearer',
163
+ expires_in: accessTokenExpiresIn,
164
+ id_token: idToken,
165
+ scope: scope.join(' '),
166
+ refresh_token: issueRefreshToken ? generateRandomString(32) : undefined,
167
+ },
168
+ resolvedAcr,
169
+ resolvedAmr,
170
+ accessTokenJti: accessTokenPayload.jti,
171
+ };
172
+ }
173
+ //# sourceMappingURL=token-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-response.js","sourceRoot":"","sources":["../src/token-response.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ export declare enum UserInfoErrorCode {
2
+ InvalidToken = "invalid_token",
3
+ InsufficientScope = "insufficient_scope"
4
+ }
5
+ export declare class UserInfoError extends Error {
6
+ readonly error: UserInfoErrorCode;
7
+ readonly errorDescription: string;
8
+ constructor(error: UserInfoErrorCode, errorDescription: string);
9
+ get statusCode(): number;
10
+ }
11
+ export interface AccessTokenInfo {
12
+ sub: string;
13
+ scope: string[];
14
+ clientId: string;
15
+ expiresAt: number;
16
+ grantId?: string;
17
+ iat?: number;
18
+ nbf?: number;
19
+ audience?: string[];
20
+ issuer?: string;
21
+ jti?: string;
22
+ claims?: ClaimsParameter;
23
+ }
24
+ export interface AccessTokenResolver {
25
+ findAccessToken(token: string): Promise<AccessTokenInfo | null>;
26
+ }
27
+ export interface AddressClaim {
28
+ formatted?: string;
29
+ street_address?: string;
30
+ locality?: string;
31
+ region?: string;
32
+ postal_code?: string;
33
+ country?: string;
34
+ }
35
+ export interface UserClaims {
36
+ sub: string;
37
+ name?: string;
38
+ family_name?: string;
39
+ given_name?: string;
40
+ middle_name?: string;
41
+ nickname?: string;
42
+ preferred_username?: string;
43
+ profile?: string;
44
+ picture?: string;
45
+ website?: string;
46
+ gender?: string;
47
+ birthdate?: string;
48
+ zoneinfo?: string;
49
+ locale?: string;
50
+ updated_at?: number;
51
+ email?: string;
52
+ email_verified?: boolean;
53
+ address?: AddressClaim;
54
+ phone_number?: string;
55
+ phone_number_verified?: boolean;
56
+ }
57
+ export interface UserClaimsResolver {
58
+ findUserClaims(sub: string): Promise<UserClaims | null>;
59
+ }
60
+ export interface ClaimRequestEntry {
61
+ essential?: boolean;
62
+ value?: unknown;
63
+ values?: unknown[];
64
+ [key: string]: unknown;
65
+ }
66
+ export type ClaimRequestValue = ClaimRequestEntry | null;
67
+ export interface ClaimsParameter {
68
+ userinfo?: Record<string, ClaimRequestValue>;
69
+ id_token?: Record<string, ClaimRequestValue>;
70
+ }
71
+ export interface UserInfoRequestContext {
72
+ accessToken: string;
73
+ accessTokenResolver: AccessTokenResolver;
74
+ userClaimsResolver: UserClaimsResolver;
75
+ claimsParameter?: ClaimsParameter;
76
+ expectedAudience?: string;
77
+ }
78
+ export type UserInfoResponse = {
79
+ sub: string;
80
+ } & Partial<Omit<UserClaims, 'sub'>>;
81
+ export declare const SCOPE_CLAIMS_MAP: Record<string, (keyof UserClaims)[]>;
82
+ export declare function filterClaimsByScope(userClaims: UserClaims, scopes: string[]): UserInfoResponse;
83
+ export declare function resolveUserInfoAccessToken(accessToken: string | undefined, accessTokenResolver: AccessTokenResolver): Promise<AccessTokenInfo>;
84
+ export declare function validateUserInfoTokenExpiration(tokenInfo: AccessTokenInfo, now?: number): void;
85
+ export declare function validateUserInfoScope(tokenInfo: AccessTokenInfo): void;
86
+ export declare function validateUserInfoAudience(tokenInfo: AccessTokenInfo, expectedAudience: string | undefined): void;
87
+ export declare function resolveUserInfoClaims(tokenInfo: AccessTokenInfo, userClaimsResolver: UserClaimsResolver): Promise<UserClaims>;
88
+ export declare function applyRequestedClaims(response: UserInfoResponse, userClaims: UserClaims, claimsParameter?: ClaimsParameter): UserInfoResponse;
89
+ export declare function handleUserInfoRequest(context: UserInfoRequestContext): Promise<UserInfoResponse>;
90
+ export interface UserInfoJwtOptions {
91
+ issuer: string;
92
+ audience: string;
93
+ privateKey: CryptoKey;
94
+ keyId?: string;
95
+ expiresIn?: number;
96
+ }
97
+ export declare function generateUserInfoJwt(userInfoResponse: UserInfoResponse, options: UserInfoJwtOptions): Promise<string>;
98
+ //# sourceMappingURL=userinfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userinfo.d.ts","sourceRoot":"","sources":["../src/userinfo.ts"],"names":[],"mappings":"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"}