@keycardai/oauth 0.1.0

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 (67) hide show
  1. package/dist/cjs/base64url.d.ts +6 -0
  2. package/dist/cjs/base64url.d.ts.map +1 -0
  3. package/dist/cjs/base64url.js +50 -0
  4. package/dist/cjs/base64url.js.map +1 -0
  5. package/dist/cjs/discovery.d.ts +27 -0
  6. package/dist/cjs/discovery.d.ts.map +1 -0
  7. package/dist/cjs/discovery.js +31 -0
  8. package/dist/cjs/discovery.js.map +1 -0
  9. package/dist/cjs/errors.d.ts +19 -0
  10. package/dist/cjs/errors.d.ts.map +1 -0
  11. package/dist/cjs/errors.js +36 -0
  12. package/dist/cjs/errors.js.map +1 -0
  13. package/dist/cjs/index.d.ts +12 -0
  14. package/dist/cjs/index.d.ts.map +1 -0
  15. package/dist/cjs/index.js +26 -0
  16. package/dist/cjs/index.js.map +1 -0
  17. package/dist/cjs/jwt/signer.d.ts +19 -0
  18. package/dist/cjs/jwt/signer.d.ts.map +1 -0
  19. package/dist/cjs/jwt/signer.js +55 -0
  20. package/dist/cjs/jwt/signer.js.map +1 -0
  21. package/dist/cjs/jwt/verifier.d.ts +8 -0
  22. package/dist/cjs/jwt/verifier.d.ts.map +1 -0
  23. package/dist/cjs/jwt/verifier.js +49 -0
  24. package/dist/cjs/jwt/verifier.js.map +1 -0
  25. package/dist/cjs/keyring.d.ts +15 -0
  26. package/dist/cjs/keyring.d.ts.map +1 -0
  27. package/dist/cjs/keyring.js +49 -0
  28. package/dist/cjs/keyring.js.map +1 -0
  29. package/dist/cjs/package.json +1 -0
  30. package/dist/cjs/tokenExchange.d.ts +31 -0
  31. package/dist/cjs/tokenExchange.d.ts.map +1 -0
  32. package/dist/cjs/tokenExchange.js +130 -0
  33. package/dist/cjs/tokenExchange.js.map +1 -0
  34. package/dist/esm/base64url.d.ts +6 -0
  35. package/dist/esm/base64url.d.ts.map +1 -0
  36. package/dist/esm/base64url.js +48 -0
  37. package/dist/esm/base64url.js.map +1 -0
  38. package/dist/esm/discovery.d.ts +27 -0
  39. package/dist/esm/discovery.d.ts.map +1 -0
  40. package/dist/esm/discovery.js +28 -0
  41. package/dist/esm/discovery.js.map +1 -0
  42. package/dist/esm/errors.d.ts +19 -0
  43. package/dist/esm/errors.d.ts.map +1 -0
  44. package/dist/esm/errors.js +27 -0
  45. package/dist/esm/errors.js.map +1 -0
  46. package/dist/esm/index.d.ts +12 -0
  47. package/dist/esm/index.d.ts.map +1 -0
  48. package/dist/esm/index.js +8 -0
  49. package/dist/esm/index.js.map +1 -0
  50. package/dist/esm/jwt/signer.d.ts +19 -0
  51. package/dist/esm/jwt/signer.d.ts.map +1 -0
  52. package/dist/esm/jwt/signer.js +48 -0
  53. package/dist/esm/jwt/signer.js.map +1 -0
  54. package/dist/esm/jwt/verifier.d.ts +8 -0
  55. package/dist/esm/jwt/verifier.d.ts.map +1 -0
  56. package/dist/esm/jwt/verifier.js +42 -0
  57. package/dist/esm/jwt/verifier.js.map +1 -0
  58. package/dist/esm/keyring.d.ts +15 -0
  59. package/dist/esm/keyring.d.ts.map +1 -0
  60. package/dist/esm/keyring.js +45 -0
  61. package/dist/esm/keyring.js.map +1 -0
  62. package/dist/esm/package.json +1 -0
  63. package/dist/esm/tokenExchange.d.ts +31 -0
  64. package/dist/esm/tokenExchange.d.ts.map +1 -0
  65. package/dist/esm/tokenExchange.js +126 -0
  66. package/dist/esm/tokenExchange.js.map +1 -0
  67. package/package.json +70 -0
@@ -0,0 +1,6 @@
1
+ declare const _default: {
2
+ encode: (data: ArrayBuffer) => string;
3
+ decode: (str: string) => ArrayBuffer;
4
+ };
5
+ export default _default;
6
+ //# sourceMappingURL=base64url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64url.d.ts","sourceRoot":"","sources":["../../src/base64url.ts"],"names":[],"mappings":";mBAoB0B,WAAW,KAAG,MAAM;kBAsBrB,MAAM,KAAG,WAAW;;AAvB7C,wBAiDE"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ /*
3
+ * Base64URL-ArrayBuffer
4
+ * https://github.com/yackermann/Base64URL-ArrayBuffer
5
+ *
6
+ * Copyright (c) 2017 Yuriy Ackermann <ackermann.yuriy@gmail.com>
7
+ * Copyright (c) 2012 Niklas von Hertzen
8
+ * Licensed under the MIT license.
9
+ *
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
13
+ // Use a lookup table to find the index.
14
+ var lookup = new Uint8Array(256);
15
+ for (var i = 0; i < CHARACTERS.length; i++) {
16
+ lookup[CHARACTERS.charCodeAt(i)] = i;
17
+ }
18
+ exports.default = {
19
+ encode: function (data) {
20
+ var bytes = new Uint8Array(data), i, len = bytes.length, str = "";
21
+ for (i = 0; i < len; i += 3) {
22
+ str += CHARACTERS[bytes[i] >> 2];
23
+ str += CHARACTERS[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];
24
+ str += CHARACTERS[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];
25
+ str += CHARACTERS[bytes[i + 2] & 63];
26
+ }
27
+ if (len % 3 === 2) {
28
+ str = str.substring(0, str.length - 1);
29
+ }
30
+ else if (len % 3 === 1) {
31
+ str = str.substring(0, str.length - 2);
32
+ }
33
+ return str;
34
+ },
35
+ decode: function (str) {
36
+ var bufferLength = str.length * 0.75, len = str.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;
37
+ var data = new ArrayBuffer(bufferLength), bytes = new Uint8Array(data);
38
+ for (i = 0; i < len; i += 4) {
39
+ encoded1 = lookup[str.charCodeAt(i)];
40
+ encoded2 = lookup[str.charCodeAt(i + 1)];
41
+ encoded3 = lookup[str.charCodeAt(i + 2)];
42
+ encoded4 = lookup[str.charCodeAt(i + 3)];
43
+ bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);
44
+ bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
45
+ bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);
46
+ }
47
+ return data;
48
+ },
49
+ };
50
+ //# sourceMappingURL=base64url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64url.js","sourceRoot":"","sources":["../../src/base64url.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAEH,MAAM,UAAU,GACd,kEAAkE,CAAC;AAErE,wCAAwC;AACxC,IAAI,MAAM,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;AACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;IAC3C,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACvC,CAAC;AAED,kBAAe;IACb,MAAM,EAAE,UAAU,IAAiB;QACjC,IAAI,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,EAC9B,CAAC,EACD,GAAG,GAAG,KAAK,CAAC,MAAM,EAClB,GAAG,GAAG,EAAE,CAAC;QAEX,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACjC,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/D,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpE,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAClB,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,EAAE,UAAU,GAAW;QAC3B,IAAI,YAAY,GAAG,GAAG,CAAC,MAAM,GAAG,IAAI,EAClC,GAAG,GAAG,GAAG,CAAC,MAAM,EAChB,CAAC,EACD,CAAC,GAAG,CAAC,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,CAAC;QAEX,IAAI,IAAI,GAAG,IAAI,WAAW,CAAC,YAAY,CAAC,EACtC,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QAE/B,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACrC,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACzC,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACzC,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAEzC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;YAC/C,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;YACtD,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ declare const OAuthAuthorizationServerMetadataSchema: z.ZodObject<{
3
+ issuer: z.ZodString;
4
+ authorization_endpoint: z.ZodOptional<z.ZodString>;
5
+ token_endpoint: z.ZodOptional<z.ZodString>;
6
+ jwks_uri: z.ZodOptional<z.ZodString>;
7
+ registration_endpoint: z.ZodOptional<z.ZodString>;
8
+ token_endpoint_auth_methods_supported: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
9
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
10
+ issuer: z.ZodString;
11
+ authorization_endpoint: z.ZodOptional<z.ZodString>;
12
+ token_endpoint: z.ZodOptional<z.ZodString>;
13
+ jwks_uri: z.ZodOptional<z.ZodString>;
14
+ registration_endpoint: z.ZodOptional<z.ZodString>;
15
+ token_endpoint_auth_methods_supported: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
16
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
17
+ issuer: z.ZodString;
18
+ authorization_endpoint: z.ZodOptional<z.ZodString>;
19
+ token_endpoint: z.ZodOptional<z.ZodString>;
20
+ jwks_uri: z.ZodOptional<z.ZodString>;
21
+ registration_endpoint: z.ZodOptional<z.ZodString>;
22
+ token_endpoint_auth_methods_supported: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
23
+ }, z.ZodTypeAny, "passthrough">>;
24
+ export type OAuthAuthorizationServerMetadata = z.infer<typeof OAuthAuthorizationServerMetadataSchema>;
25
+ export declare function fetchAuthorizationServerMetadata(issuer: string): Promise<OAuthAuthorizationServerMetadata>;
26
+ export {};
27
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,sCAAsC;;;;;;;;;;;;;;;;;;;;;gCAO5B,CAAC;AAEjB,MAAM,MAAM,gCAAgC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sCAAsC,CAAC,CAAC;AAEtG,wBAAsB,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gCAAgC,CAAC,CAsBhH"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchAuthorizationServerMetadata = fetchAuthorizationServerMetadata;
4
+ const zod_1 = require("zod");
5
+ const OAuthAuthorizationServerMetadataSchema = zod_1.z.object({
6
+ issuer: zod_1.z.string(),
7
+ authorization_endpoint: zod_1.z.string().optional(),
8
+ token_endpoint: zod_1.z.string().optional(),
9
+ jwks_uri: zod_1.z.string().optional(),
10
+ registration_endpoint: zod_1.z.string().optional(),
11
+ token_endpoint_auth_methods_supported: zod_1.z.array(zod_1.z.string()).optional(),
12
+ }).passthrough();
13
+ async function fetchAuthorizationServerMetadata(issuer) {
14
+ const issuerURL = new URL(issuer);
15
+ let path = issuerURL.pathname;
16
+ if (path.endsWith("/")) {
17
+ path = path.slice(0, -1);
18
+ }
19
+ const url = new URL(`/.well-known/oauth-authorization-server${path}`, issuer);
20
+ const response = await fetch(url);
21
+ if (!response.ok) {
22
+ throw new Error(`Failed to fetch OAuth authorization server metadata for "${issuer}"`);
23
+ }
24
+ const json = await response.json();
25
+ const metadata = OAuthAuthorizationServerMetadataSchema.parse(json);
26
+ if (metadata.issuer !== issuer) {
27
+ throw new Error(`Issuer mismatch in OAuth authorization server metadata for "${issuer}"`);
28
+ }
29
+ return metadata;
30
+ }
31
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/discovery.ts"],"names":[],"mappings":";;AAaA,4EAsBC;AAnCD,6BAAwB;AAExB,MAAM,sCAAsC,GAAG,OAAC,CAAC,MAAM,CAAC;IACtD,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;IAClB,sBAAsB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7C,cAAc,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,qBAAqB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5C,qCAAqC,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACtE,CAAC,CAAC,WAAW,EAAE,CAAC;AAIV,KAAK,UAAU,gCAAgC,CAAC,MAAc;IACnE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC;IAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,0CAA0C,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,4DAA4D,MAAM,GAAG,CACtE,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,sCAAsC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpE,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,+DAA+D,MAAM,GAAG,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,19 @@
1
+ export declare class HTTPError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare class BadRequestError extends HTTPError {
5
+ }
6
+ export declare class UnauthorizedError extends HTTPError {
7
+ }
8
+ export declare class OAuthError extends Error {
9
+ readonly errorCode: string;
10
+ readonly errorUri?: string | undefined;
11
+ constructor(errorCode: string, message: string, errorUri?: string | undefined);
12
+ }
13
+ export declare class InvalidTokenError extends OAuthError {
14
+ constructor(message: string, errorUri?: string);
15
+ }
16
+ export declare class InsufficientScopeError extends OAuthError {
17
+ constructor(message: string, errorUri?: string);
18
+ }
19
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAU,SAAQ,KAAK;gBAEhC,OAAO,EAAE,MAAM;CAIlB;AAED,qBAAa,eAAgB,SAAQ,SAAS;CAC7C;AAED,qBAAa,iBAAkB,SAAQ,SAAS;CAC/C;AAED,qBAAa,UAAW,SAAQ,KAAK;aAEjB,SAAS,EAAE,MAAM;aAEjB,QAAQ,CAAC,EAAE,MAAM;gBAFjB,SAAS,EAAE,MAAM,EACjC,OAAO,EAAE,MAAM,EACC,QAAQ,CAAC,EAAE,MAAM,YAAA;CAIpC;AAED,qBAAa,iBAAkB,SAAQ,UAAU;gBACnC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;CAG/C;AAED,qBAAa,sBAAuB,SAAQ,UAAU;gBACxC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;CAG/C"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InsufficientScopeError = exports.InvalidTokenError = exports.OAuthError = exports.UnauthorizedError = exports.BadRequestError = exports.HTTPError = void 0;
4
+ class HTTPError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ }
8
+ }
9
+ exports.HTTPError = HTTPError;
10
+ class BadRequestError extends HTTPError {
11
+ }
12
+ exports.BadRequestError = BadRequestError;
13
+ class UnauthorizedError extends HTTPError {
14
+ }
15
+ exports.UnauthorizedError = UnauthorizedError;
16
+ class OAuthError extends Error {
17
+ constructor(errorCode, message, errorUri) {
18
+ super(message);
19
+ this.errorCode = errorCode;
20
+ this.errorUri = errorUri;
21
+ }
22
+ }
23
+ exports.OAuthError = OAuthError;
24
+ class InvalidTokenError extends OAuthError {
25
+ constructor(message, errorUri) {
26
+ super("invalid_token", message, errorUri);
27
+ }
28
+ }
29
+ exports.InvalidTokenError = InvalidTokenError;
30
+ class InsufficientScopeError extends OAuthError {
31
+ constructor(message, errorUri) {
32
+ super("insufficient_scope", message, errorUri);
33
+ }
34
+ }
35
+ exports.InsufficientScopeError = InsufficientScopeError;
36
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";;;AAAA,MAAa,SAAU,SAAQ,KAAK;IAClC,YACE,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF;AAND,8BAMC;AAED,MAAa,eAAgB,SAAQ,SAAS;CAC7C;AADD,0CACC;AAED,MAAa,iBAAkB,SAAQ,SAAS;CAC/C;AADD,8CACC;AAED,MAAa,UAAW,SAAQ,KAAK;IACnC,YACkB,SAAiB,EACjC,OAAe,EACC,QAAiB;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,cAAS,GAAT,SAAS,CAAQ;QAEjB,aAAQ,GAAR,QAAQ,CAAS;IAGnC,CAAC;CACF;AARD,gCAQC;AAED,MAAa,iBAAkB,SAAQ,UAAU;IAC/C,YAAY,OAAe,EAAE,QAAiB;QAC5C,KAAK,CAAC,eAAe,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;CACF;AAJD,8CAIC;AAED,MAAa,sBAAuB,SAAQ,UAAU;IACpD,YAAY,OAAe,EAAE,QAAiB;QAC5C,KAAK,CAAC,oBAAoB,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;CACF;AAJD,wDAIC"}
@@ -0,0 +1,12 @@
1
+ export type { OAuthKeyring, PrivateKeyring, IdentifiableKey } from "./keyring.js";
2
+ export { JWKSOAuthKeyring } from "./keyring.js";
3
+ export { default as base64url } from "./base64url.js";
4
+ export { fetchAuthorizationServerMetadata } from "./discovery.js";
5
+ export type { OAuthAuthorizationServerMetadata } from "./discovery.js";
6
+ export { HTTPError, BadRequestError, UnauthorizedError, OAuthError, InvalidTokenError, InsufficientScopeError } from "./errors.js";
7
+ export { JWTSigner } from "./jwt/signer.js";
8
+ export type { JWTClaims } from "./jwt/signer.js";
9
+ export { JWTVerifier } from "./jwt/verifier.js";
10
+ export { TokenExchangeClient } from "./tokenExchange.js";
11
+ export type { TokenExchangeRequest, TokenResponse, TokenExchangeClientOptions } from "./tokenExchange.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AAClE,YAAY,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACnI,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TokenExchangeClient = exports.JWTVerifier = exports.JWTSigner = exports.InsufficientScopeError = exports.InvalidTokenError = exports.OAuthError = exports.UnauthorizedError = exports.BadRequestError = exports.HTTPError = exports.fetchAuthorizationServerMetadata = exports.base64url = exports.JWKSOAuthKeyring = void 0;
7
+ var keyring_js_1 = require("./keyring.js");
8
+ Object.defineProperty(exports, "JWKSOAuthKeyring", { enumerable: true, get: function () { return keyring_js_1.JWKSOAuthKeyring; } });
9
+ var base64url_js_1 = require("./base64url.js");
10
+ Object.defineProperty(exports, "base64url", { enumerable: true, get: function () { return __importDefault(base64url_js_1).default; } });
11
+ var discovery_js_1 = require("./discovery.js");
12
+ Object.defineProperty(exports, "fetchAuthorizationServerMetadata", { enumerable: true, get: function () { return discovery_js_1.fetchAuthorizationServerMetadata; } });
13
+ var errors_js_1 = require("./errors.js");
14
+ Object.defineProperty(exports, "HTTPError", { enumerable: true, get: function () { return errors_js_1.HTTPError; } });
15
+ Object.defineProperty(exports, "BadRequestError", { enumerable: true, get: function () { return errors_js_1.BadRequestError; } });
16
+ Object.defineProperty(exports, "UnauthorizedError", { enumerable: true, get: function () { return errors_js_1.UnauthorizedError; } });
17
+ Object.defineProperty(exports, "OAuthError", { enumerable: true, get: function () { return errors_js_1.OAuthError; } });
18
+ Object.defineProperty(exports, "InvalidTokenError", { enumerable: true, get: function () { return errors_js_1.InvalidTokenError; } });
19
+ Object.defineProperty(exports, "InsufficientScopeError", { enumerable: true, get: function () { return errors_js_1.InsufficientScopeError; } });
20
+ var signer_js_1 = require("./jwt/signer.js");
21
+ Object.defineProperty(exports, "JWTSigner", { enumerable: true, get: function () { return signer_js_1.JWTSigner; } });
22
+ var verifier_js_1 = require("./jwt/verifier.js");
23
+ Object.defineProperty(exports, "JWTVerifier", { enumerable: true, get: function () { return verifier_js_1.JWTVerifier; } });
24
+ var tokenExchange_js_1 = require("./tokenExchange.js");
25
+ Object.defineProperty(exports, "TokenExchangeClient", { enumerable: true, get: function () { return tokenExchange_js_1.TokenExchangeClient; } });
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AACA,2CAAgD;AAAvC,8GAAA,gBAAgB,OAAA;AACzB,+CAAsD;AAA7C,0HAAA,OAAO,OAAa;AAC7B,+CAAkE;AAAzD,gIAAA,gCAAgC,OAAA;AAEzC,yCAAmI;AAA1H,sGAAA,SAAS,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AAAE,uGAAA,UAAU,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AAAE,mHAAA,sBAAsB,OAAA;AAC7G,6CAA4C;AAAnC,sGAAA,SAAS,OAAA;AAElB,iDAAgD;AAAvC,0GAAA,WAAW,OAAA;AACpB,uDAAyD;AAAhD,uHAAA,mBAAmB,OAAA"}
@@ -0,0 +1,19 @@
1
+ import { PrivateKeyring } from "../keyring.js";
2
+ export interface JWTClaims {
3
+ iss?: string;
4
+ sub?: string;
5
+ aud?: string | string[];
6
+ exp?: number;
7
+ nbf?: number;
8
+ iat?: number;
9
+ jti?: string;
10
+ scope?: string;
11
+ client_id?: string;
12
+ [key: string]: unknown;
13
+ }
14
+ export declare class JWTSigner {
15
+ #private;
16
+ constructor(keyring: PrivateKeyring);
17
+ sign(claims: JWTClaims): Promise<string>;
18
+ }
19
+ //# sourceMappingURL=signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../../src/jwt/signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,SAAS;;gBAGR,OAAO,EAAE,cAAc;IAI7B,IAAI,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;CA2B/C"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ var _JWTSigner_privateKeyring;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.JWTSigner = void 0;
19
+ const base64url_js_1 = __importDefault(require("../base64url.js"));
20
+ class JWTSigner {
21
+ constructor(keyring) {
22
+ _JWTSigner_privateKeyring.set(this, void 0);
23
+ __classPrivateFieldSet(this, _JWTSigner_privateKeyring, keyring, "f");
24
+ }
25
+ async sign(claims) {
26
+ const { key, kid, issuer } = await __classPrivateFieldGet(this, _JWTSigner_privateKeyring, "f").key('sign');
27
+ const jsonHeader = {
28
+ alg: 'RS256',
29
+ kid: kid
30
+ };
31
+ const resolvedClaims = { ...claims };
32
+ if (issuer && !resolvedClaims.iss) {
33
+ resolvedClaims.iss = issuer;
34
+ }
35
+ const header = btoau(JSON.stringify(jsonHeader));
36
+ const payload = btoau(JSON.stringify(resolvedClaims));
37
+ const input = `${header}.${payload}`;
38
+ let signature = await crypto.subtle.sign({
39
+ name: 'RSASSA-PKCS1-v1_5',
40
+ }, key, stringToUint8Array(input));
41
+ return `${input}.${base64url_js_1.default.encode(signature)}`;
42
+ }
43
+ }
44
+ exports.JWTSigner = JWTSigner;
45
+ _JWTSigner_privateKeyring = new WeakMap();
46
+ function btoau(str) {
47
+ return btoa(str).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
48
+ }
49
+ // TextEncoder.encode() always returns a Uint8Array backed by ArrayBuffer,
50
+ // but TS 5.7+ types .buffer as ArrayBufferLike (includes SharedArrayBuffer).
51
+ // The cast is safe and necessary for crypto.subtle.sign's BufferSource parameter.
52
+ function stringToUint8Array(str) {
53
+ return new TextEncoder().encode(str).buffer;
54
+ }
55
+ //# sourceMappingURL=signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.js","sourceRoot":"","sources":["../../../src/jwt/signer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AACA,mEAAuC;AAevC,MAAa,SAAS;IAGpB,YAAY,OAAuB;QAFnC,4CAAgC;QAG9B,uBAAA,IAAI,6BAAmB,OAAO,MAAA,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAiB;QAC1B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAI,MAAM,uBAAA,IAAI,iCAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAErE,MAAM,UAAU,GAAG;YACjB,GAAG,EAAE,OAAO;YACZ,GAAG,EAAE,GAAG;SACT,CAAC;QAEF,MAAM,cAAc,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;QACrC,IAAI,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC;YAClC,cAAc,CAAC,GAAG,GAAG,MAAM,CAAC;QAC9B,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;QAEtD,MAAM,KAAK,GAAG,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC;QACrC,IAAI,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CACtC;YACE,IAAI,EAAE,mBAAmB;SAC1B,EACD,GAAG,EACH,kBAAkB,CAAC,KAAK,CAAC,CAC1B,CAAC;QAEF,OAAO,GAAG,KAAK,IAAI,sBAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IACnD,CAAC;CACF;AAlCD,8BAkCC;;AAED,SAAS,KAAK,CAAC,GAAW;IACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;AAC5E,CAAC;AAED,0EAA0E;AAC1E,6EAA6E;AAC7E,kFAAkF;AAClF,SAAS,kBAAkB,CAAC,GAAW;IACrC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAqB,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { OAuthKeyring } from "../keyring.js";
2
+ import type { JWTClaims } from "./signer.js";
3
+ export declare class JWTVerifier {
4
+ #private;
5
+ constructor(keyring: OAuthKeyring);
6
+ verify(token: string): Promise<JWTClaims>;
7
+ }
8
+ //# sourceMappingURL=verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../../src/jwt/verifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,qBAAa,WAAW;;gBAGV,OAAO,EAAE,YAAY;IAI3B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CA2BhD"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ var _JWTVerifier_keyring;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.JWTVerifier = void 0;
19
+ const errors_js_1 = require("../errors.js");
20
+ const base64url_js_1 = __importDefault(require("../base64url.js"));
21
+ class JWTVerifier {
22
+ constructor(keyring) {
23
+ _JWTVerifier_keyring.set(this, void 0);
24
+ __classPrivateFieldSet(this, _JWTVerifier_keyring, keyring, "f");
25
+ }
26
+ async verify(token) {
27
+ const [header, payload, signature, ...rest] = token.split('.');
28
+ const jsonHeader = JSON.parse(autob(header));
29
+ const jsonPayload = JSON.parse(autob(payload));
30
+ if (!jsonPayload.iss) {
31
+ throw new errors_js_1.InvalidTokenError("JWT missing issuer (iss) claim");
32
+ }
33
+ const key = await __classPrivateFieldGet(this, _JWTVerifier_keyring, "f").key(jsonPayload.iss, jsonHeader.kid);
34
+ const verified = await crypto.subtle.verify({
35
+ name: 'RSASSA-PKCS1-v1_5',
36
+ hash: { name: 'SHA-256' },
37
+ }, key, base64url_js_1.default.decode(signature), new TextEncoder().encode(`${header}.${payload}`));
38
+ if (!verified) {
39
+ throw new errors_js_1.InvalidTokenError("Invalid signature");
40
+ }
41
+ return jsonPayload;
42
+ }
43
+ }
44
+ exports.JWTVerifier = JWTVerifier;
45
+ _JWTVerifier_keyring = new WeakMap();
46
+ function autob(data) {
47
+ return atob(data.replace(/-/g, '+').replace(/_/g, '/'));
48
+ }
49
+ //# sourceMappingURL=verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../../src/jwt/verifier.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AACA,4CAAiD;AACjD,mEAAwC;AAGxC,MAAa,WAAW;IAGtB,YAAY,OAAqB;QAFjC,uCAAuB;QAGrB,uBAAA,IAAI,wBAAY,OAAO,MAAA,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE/D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAc,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAE1D,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;YACrB,MAAM,IAAI,6BAAiB,CAAC,gCAAgC,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,uBAAA,IAAI,4BAAS,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;QAErE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CACzC;YACE,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;SAC1B,EACD,GAAG,EACH,sBAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAC3B,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC,CACjD,CAAC;QACF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,6BAAiB,CAAC,mBAAmB,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;AAlCD,kCAkCC;;AAED,SAAS,KAAK,CAAC,IAAY;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface OAuthKeyring {
2
+ key(issuer: string, kid: string): Promise<CryptoKey>;
3
+ }
4
+ export type IdentifiableKey = {
5
+ key: CryptoKey;
6
+ issuer: string;
7
+ kid: string;
8
+ };
9
+ export interface PrivateKeyring {
10
+ key(usage: string): Promise<IdentifiableKey>;
11
+ }
12
+ export declare class JWKSOAuthKeyring implements OAuthKeyring {
13
+ key(issuer: string, kid: string): Promise<CryptoKey>;
14
+ }
15
+ //# sourceMappingURL=keyring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyring.d.ts","sourceRoot":"","sources":["../../src/keyring.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;CACrD;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;CAC7C;AAyBD,qBAAa,gBAAiB,YAAW,YAAY;IAE7C,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CA8B3D"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JWKSOAuthKeyring = void 0;
4
+ const zod_1 = require("zod");
5
+ const discovery_js_1 = require("./discovery.js");
6
+ const JWKSchema = zod_1.z.object({
7
+ kty: zod_1.z.string(),
8
+ alg: zod_1.z.string().optional(),
9
+ use: zod_1.z.string().optional(),
10
+ kid: zod_1.z.string().optional(),
11
+ });
12
+ const RSAJWKSchema = JWKSchema.extend({
13
+ n: zod_1.z.string(),
14
+ e: zod_1.z.string(),
15
+ });
16
+ const ECJWKSchema = JWKSchema.extend({
17
+ crv: zod_1.z.string(),
18
+ x: zod_1.z.string(),
19
+ y: zod_1.z.string(),
20
+ });
21
+ const JWKSetSchema = zod_1.z.object({
22
+ keys: zod_1.z.array(zod_1.z.union([RSAJWKSchema, ECJWKSchema])),
23
+ });
24
+ class JWKSOAuthKeyring {
25
+ async key(issuer, kid) {
26
+ const authorizationServer = await (0, discovery_js_1.fetchAuthorizationServerMetadata)(issuer);
27
+ if (!authorizationServer.jwks_uri) {
28
+ throw new Error(`No JSON Web Key Set available for "${issuer}"`);
29
+ }
30
+ const response = await fetch(authorizationServer.jwks_uri);
31
+ if (!response.ok) {
32
+ throw new Error(`Failed to fetch OAuth authorization server metadata for "${issuer}"`);
33
+ }
34
+ const json = await response.json();
35
+ const jwkSet = JWKSetSchema.parse(json);
36
+ const jwk = jwkSet.keys.find((jwk) => jwk.kid === kid);
37
+ if (!jwk) {
38
+ throw new Error(`Failed to find key "${kid}" of "${issuer}"`);
39
+ }
40
+ // TODO: make this more robust to uses and algs
41
+ const key = await crypto.subtle.importKey('jwk', jwk, {
42
+ name: 'RSASSA-PKCS1-v1_5',
43
+ hash: { name: 'SHA-256' },
44
+ }, true, ['verify']);
45
+ return key;
46
+ }
47
+ }
48
+ exports.JWKSOAuthKeyring = JWKSOAuthKeyring;
49
+ //# sourceMappingURL=keyring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyring.js","sourceRoot":"","sources":["../../src/keyring.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AACxB,iDAAkE;AAiBlE,MAAM,SAAS,GAAG,OAAC,CAAC,MAAM,CAAC;IACzB,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;IACf,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3B,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC;IACpC,CAAC,EAAE,OAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,OAAC,CAAC,MAAM,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC;IACnC,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;IACf,CAAC,EAAE,OAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,OAAC,CAAC,MAAM,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,OAAC,CAAC,MAAM,CAAC;IAC5B,IAAI,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,KAAK,CAAC,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;CACpD,CAAC,CAAC;AAEH,MAAa,gBAAgB;IAE3B,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,GAAW;QACnC,MAAM,mBAAmB,GAAG,MAAM,IAAA,+CAAgC,EAAC,MAAM,CAAC,CAAC;QAC3E,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,GAAG,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,4DAA4D,MAAM,GAAG,CAAC,CAAC;QACzF,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QACvD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,SAAS,MAAM,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,+CAA+C;QAC/C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CACvC,KAAK,EACL,GAAG,EACH;YACE,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;SAC1B,EACD,IAAI,EACJ,CAAC,QAAQ,CAAC,CACX,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAhCD,4CAgCC"}
@@ -0,0 +1 @@
1
+ {"type": "commonjs"}
@@ -0,0 +1,31 @@
1
+ export interface TokenExchangeRequest {
2
+ grantType?: string;
3
+ resource?: string;
4
+ audience?: string;
5
+ scope?: string;
6
+ requestedTokenType?: string;
7
+ subjectToken: string;
8
+ subjectTokenType?: string;
9
+ actorToken?: string;
10
+ actorTokenType?: string;
11
+ clientAssertion?: string;
12
+ clientAssertionType?: string;
13
+ }
14
+ export interface TokenResponse {
15
+ accessToken: string;
16
+ tokenType: string;
17
+ expiresIn?: number;
18
+ refreshToken?: string;
19
+ scope?: string[];
20
+ issuedTokenType?: string;
21
+ }
22
+ export interface TokenExchangeClientOptions {
23
+ clientId?: string;
24
+ clientSecret?: string;
25
+ }
26
+ export declare class TokenExchangeClient {
27
+ #private;
28
+ constructor(issuerUrl: string, options?: TokenExchangeClientOptions);
29
+ exchangeToken(request: TokenExchangeRequest): Promise<TokenResponse>;
30
+ }
31
+ //# sourceMappingURL=tokenExchange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenExchange.d.ts","sourceRoot":"","sources":["../../src/tokenExchange.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAkDD,qBAAa,mBAAmB;;gBAOlB,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,0BAA0B;IAM7D,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC;CA2D3E"}