@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,130 @@
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 _TokenExchangeClient_instances, _TokenExchangeClient_issuerUrl, _TokenExchangeClient_clientId, _TokenExchangeClient_clientSecret, _TokenExchangeClient_tokenEndpoint, _TokenExchangeClient_discoveryPromise, _TokenExchangeClient_getTokenEndpoint;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.TokenExchangeClient = void 0;
16
+ const discovery_js_1 = require("./discovery.js");
17
+ // =============================================================================
18
+ // Wire format helpers (camelCase <-> snake_case at the boundary)
19
+ // =============================================================================
20
+ function serializeRequest(request) {
21
+ const params = new URLSearchParams();
22
+ params.set("grant_type", request.grantType ?? "urn:ietf:params:oauth:grant-type:token-exchange");
23
+ params.set("subject_token", request.subjectToken);
24
+ params.set("subject_token_type", request.subjectTokenType ?? "urn:ietf:params:oauth:token-type:access_token");
25
+ if (request.resource)
26
+ params.set("resource", request.resource);
27
+ if (request.audience)
28
+ params.set("audience", request.audience);
29
+ if (request.scope)
30
+ params.set("scope", request.scope);
31
+ if (request.requestedTokenType)
32
+ params.set("requested_token_type", request.requestedTokenType);
33
+ if (request.actorToken)
34
+ params.set("actor_token", request.actorToken);
35
+ if (request.actorTokenType)
36
+ params.set("actor_token_type", request.actorTokenType);
37
+ if (request.clientAssertion)
38
+ params.set("client_assertion", request.clientAssertion);
39
+ if (request.clientAssertionType)
40
+ params.set("client_assertion_type", request.clientAssertionType);
41
+ return params;
42
+ }
43
+ function deserializeResponse(json) {
44
+ const accessToken = json.access_token;
45
+ if (typeof accessToken !== "string" || !accessToken) {
46
+ throw new Error("Token exchange response missing access_token");
47
+ }
48
+ const response = {
49
+ accessToken,
50
+ tokenType: typeof json.token_type === "string" ? json.token_type : "bearer",
51
+ };
52
+ if (typeof json.expires_in === "number")
53
+ response.expiresIn = json.expires_in;
54
+ if (typeof json.refresh_token === "string")
55
+ response.refreshToken = json.refresh_token;
56
+ if (typeof json.issued_token_type === "string")
57
+ response.issuedTokenType = json.issued_token_type;
58
+ if (typeof json.scope === "string") {
59
+ response.scope = json.scope.split(" ").filter(Boolean);
60
+ }
61
+ return response;
62
+ }
63
+ // =============================================================================
64
+ // Token Exchange Client
65
+ // =============================================================================
66
+ class TokenExchangeClient {
67
+ constructor(issuerUrl, options) {
68
+ _TokenExchangeClient_instances.add(this);
69
+ _TokenExchangeClient_issuerUrl.set(this, void 0);
70
+ _TokenExchangeClient_clientId.set(this, void 0);
71
+ _TokenExchangeClient_clientSecret.set(this, void 0);
72
+ _TokenExchangeClient_tokenEndpoint.set(this, void 0);
73
+ _TokenExchangeClient_discoveryPromise.set(this, void 0);
74
+ __classPrivateFieldSet(this, _TokenExchangeClient_issuerUrl, issuerUrl, "f");
75
+ __classPrivateFieldSet(this, _TokenExchangeClient_clientId, options?.clientId, "f");
76
+ __classPrivateFieldSet(this, _TokenExchangeClient_clientSecret, options?.clientSecret, "f");
77
+ }
78
+ async exchangeToken(request) {
79
+ const tokenEndpoint = await __classPrivateFieldGet(this, _TokenExchangeClient_instances, "m", _TokenExchangeClient_getTokenEndpoint).call(this);
80
+ const body = serializeRequest(request);
81
+ const headers = {
82
+ "Content-Type": "application/x-www-form-urlencoded",
83
+ };
84
+ if (__classPrivateFieldGet(this, _TokenExchangeClient_clientId, "f") && __classPrivateFieldGet(this, _TokenExchangeClient_clientSecret, "f")) {
85
+ const credentials = btoa(`${__classPrivateFieldGet(this, _TokenExchangeClient_clientId, "f")}:${__classPrivateFieldGet(this, _TokenExchangeClient_clientSecret, "f")}`);
86
+ headers["Authorization"] = `Basic ${credentials}`;
87
+ }
88
+ const response = await fetch(tokenEndpoint, {
89
+ method: "POST",
90
+ headers,
91
+ body: body.toString(),
92
+ });
93
+ if (!response.ok) {
94
+ let errorDetail = "";
95
+ try {
96
+ const errorBody = await response.json();
97
+ errorDetail = typeof errorBody.error_description === "string"
98
+ ? errorBody.error_description
99
+ : typeof errorBody.error === "string"
100
+ ? errorBody.error
101
+ : "";
102
+ }
103
+ catch {
104
+ // ignore parse errors
105
+ }
106
+ throw new Error(`Token exchange failed (HTTP ${response.status})${errorDetail ? `: ${errorDetail}` : ""}`);
107
+ }
108
+ const json = await response.json();
109
+ return deserializeResponse(json);
110
+ }
111
+ }
112
+ exports.TokenExchangeClient = TokenExchangeClient;
113
+ _TokenExchangeClient_issuerUrl = new WeakMap(), _TokenExchangeClient_clientId = new WeakMap(), _TokenExchangeClient_clientSecret = new WeakMap(), _TokenExchangeClient_tokenEndpoint = new WeakMap(), _TokenExchangeClient_discoveryPromise = new WeakMap(), _TokenExchangeClient_instances = new WeakSet(), _TokenExchangeClient_getTokenEndpoint = async function _TokenExchangeClient_getTokenEndpoint() {
114
+ if (__classPrivateFieldGet(this, _TokenExchangeClient_tokenEndpoint, "f")) {
115
+ return __classPrivateFieldGet(this, _TokenExchangeClient_tokenEndpoint, "f");
116
+ }
117
+ // Promise-based lock: only one concurrent discovery
118
+ if (!__classPrivateFieldGet(this, _TokenExchangeClient_discoveryPromise, "f")) {
119
+ __classPrivateFieldSet(this, _TokenExchangeClient_discoveryPromise, (async () => {
120
+ const metadata = await (0, discovery_js_1.fetchAuthorizationServerMetadata)(__classPrivateFieldGet(this, _TokenExchangeClient_issuerUrl, "f"));
121
+ if (!metadata.token_endpoint) {
122
+ throw new Error(`Authorization server "${__classPrivateFieldGet(this, _TokenExchangeClient_issuerUrl, "f")}" does not advertise a token_endpoint`);
123
+ }
124
+ __classPrivateFieldSet(this, _TokenExchangeClient_tokenEndpoint, metadata.token_endpoint, "f");
125
+ return __classPrivateFieldGet(this, _TokenExchangeClient_tokenEndpoint, "f");
126
+ })(), "f");
127
+ }
128
+ return __classPrivateFieldGet(this, _TokenExchangeClient_discoveryPromise, "f");
129
+ };
130
+ //# sourceMappingURL=tokenExchange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenExchange.js","sourceRoot":"","sources":["../../src/tokenExchange.ts"],"names":[],"mappings":"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"}
@@ -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,48 @@
1
+ /*
2
+ * Base64URL-ArrayBuffer
3
+ * https://github.com/yackermann/Base64URL-ArrayBuffer
4
+ *
5
+ * Copyright (c) 2017 Yuriy Ackermann <ackermann.yuriy@gmail.com>
6
+ * Copyright (c) 2012 Niklas von Hertzen
7
+ * Licensed under the MIT license.
8
+ *
9
+ */
10
+ const CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
11
+ // Use a lookup table to find the index.
12
+ var lookup = new Uint8Array(256);
13
+ for (var i = 0; i < CHARACTERS.length; i++) {
14
+ lookup[CHARACTERS.charCodeAt(i)] = i;
15
+ }
16
+ export default {
17
+ encode: function (data) {
18
+ var bytes = new Uint8Array(data), i, len = bytes.length, str = "";
19
+ for (i = 0; i < len; i += 3) {
20
+ str += CHARACTERS[bytes[i] >> 2];
21
+ str += CHARACTERS[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];
22
+ str += CHARACTERS[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];
23
+ str += CHARACTERS[bytes[i + 2] & 63];
24
+ }
25
+ if (len % 3 === 2) {
26
+ str = str.substring(0, str.length - 1);
27
+ }
28
+ else if (len % 3 === 1) {
29
+ str = str.substring(0, str.length - 2);
30
+ }
31
+ return str;
32
+ },
33
+ decode: function (str) {
34
+ var bufferLength = str.length * 0.75, len = str.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;
35
+ var data = new ArrayBuffer(bufferLength), bytes = new Uint8Array(data);
36
+ for (i = 0; i < len; i += 4) {
37
+ encoded1 = lookup[str.charCodeAt(i)];
38
+ encoded2 = lookup[str.charCodeAt(i + 1)];
39
+ encoded3 = lookup[str.charCodeAt(i + 2)];
40
+ encoded4 = lookup[str.charCodeAt(i + 3)];
41
+ bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);
42
+ bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
43
+ bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);
44
+ }
45
+ return data;
46
+ },
47
+ };
48
+ //# sourceMappingURL=base64url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base64url.js","sourceRoot":"","sources":["../../src/base64url.ts"],"names":[],"mappings":"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"}
@@ -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,28 @@
1
+ import { z } from "zod";
2
+ const OAuthAuthorizationServerMetadataSchema = z.object({
3
+ issuer: z.string(),
4
+ authorization_endpoint: z.string().optional(),
5
+ token_endpoint: z.string().optional(),
6
+ jwks_uri: z.string().optional(),
7
+ registration_endpoint: z.string().optional(),
8
+ token_endpoint_auth_methods_supported: z.array(z.string()).optional(),
9
+ }).passthrough();
10
+ export async function fetchAuthorizationServerMetadata(issuer) {
11
+ const issuerURL = new URL(issuer);
12
+ let path = issuerURL.pathname;
13
+ if (path.endsWith("/")) {
14
+ path = path.slice(0, -1);
15
+ }
16
+ const url = new URL(`/.well-known/oauth-authorization-server${path}`, issuer);
17
+ const response = await fetch(url);
18
+ if (!response.ok) {
19
+ throw new Error(`Failed to fetch OAuth authorization server metadata for "${issuer}"`);
20
+ }
21
+ const json = await response.json();
22
+ const metadata = OAuthAuthorizationServerMetadataSchema.parse(json);
23
+ if (metadata.issuer !== issuer) {
24
+ throw new Error(`Issuer mismatch in OAuth authorization server metadata for "${issuer}"`);
25
+ }
26
+ return metadata;
27
+ }
28
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,sCAAsC,GAAG,CAAC,CAAC,MAAM,CAAC;IACtD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5C,qCAAqC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACtE,CAAC,CAAC,WAAW,EAAE,CAAC;AAIjB,MAAM,CAAC,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,27 @@
1
+ export class HTTPError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ }
5
+ }
6
+ export class BadRequestError extends HTTPError {
7
+ }
8
+ export class UnauthorizedError extends HTTPError {
9
+ }
10
+ export class OAuthError extends Error {
11
+ constructor(errorCode, message, errorUri) {
12
+ super(message);
13
+ this.errorCode = errorCode;
14
+ this.errorUri = errorUri;
15
+ }
16
+ }
17
+ export class InvalidTokenError extends OAuthError {
18
+ constructor(message, errorUri) {
19
+ super("invalid_token", message, errorUri);
20
+ }
21
+ }
22
+ export class InsufficientScopeError extends OAuthError {
23
+ constructor(message, errorUri) {
24
+ super("insufficient_scope", message, errorUri);
25
+ }
26
+ }
27
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YACE,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,SAAS;CAC7C;AAED,MAAM,OAAO,iBAAkB,SAAQ,SAAS;CAC/C;AAED,MAAM,OAAO,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;AAED,MAAM,OAAO,iBAAkB,SAAQ,UAAU;IAC/C,YAAY,OAAe,EAAE,QAAiB;QAC5C,KAAK,CAAC,eAAe,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,UAAU;IACpD,YAAY,OAAe,EAAE,QAAiB;QAC5C,KAAK,CAAC,oBAAoB,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;CACF"}
@@ -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,8 @@
1
+ export { JWKSOAuthKeyring } from "./keyring.js";
2
+ export { default as base64url } from "./base64url.js";
3
+ export { fetchAuthorizationServerMetadata } from "./discovery.js";
4
+ export { HTTPError, BadRequestError, UnauthorizedError, OAuthError, InvalidTokenError, InsufficientScopeError } from "./errors.js";
5
+ export { JWTSigner } from "./jwt/signer.js";
6
+ export { JWTVerifier } from "./jwt/verifier.js";
7
+ export { TokenExchangeClient } from "./tokenExchange.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,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;AAElE,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;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -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,48 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ 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");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ 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");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _JWTSigner_privateKeyring;
13
+ import base64url from "../base64url.js";
14
+ export class JWTSigner {
15
+ constructor(keyring) {
16
+ _JWTSigner_privateKeyring.set(this, void 0);
17
+ __classPrivateFieldSet(this, _JWTSigner_privateKeyring, keyring, "f");
18
+ }
19
+ async sign(claims) {
20
+ const { key, kid, issuer } = await __classPrivateFieldGet(this, _JWTSigner_privateKeyring, "f").key('sign');
21
+ const jsonHeader = {
22
+ alg: 'RS256',
23
+ kid: kid
24
+ };
25
+ const resolvedClaims = { ...claims };
26
+ if (issuer && !resolvedClaims.iss) {
27
+ resolvedClaims.iss = issuer;
28
+ }
29
+ const header = btoau(JSON.stringify(jsonHeader));
30
+ const payload = btoau(JSON.stringify(resolvedClaims));
31
+ const input = `${header}.${payload}`;
32
+ let signature = await crypto.subtle.sign({
33
+ name: 'RSASSA-PKCS1-v1_5',
34
+ }, key, stringToUint8Array(input));
35
+ return `${input}.${base64url.encode(signature)}`;
36
+ }
37
+ }
38
+ _JWTSigner_privateKeyring = new WeakMap();
39
+ function btoau(str) {
40
+ return btoa(str).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
41
+ }
42
+ // TextEncoder.encode() always returns a Uint8Array backed by ArrayBuffer,
43
+ // but TS 5.7+ types .buffer as ArrayBufferLike (includes SharedArrayBuffer).
44
+ // The cast is safe and necessary for crypto.subtle.sign's BufferSource parameter.
45
+ function stringToUint8Array(str) {
46
+ return new TextEncoder().encode(str).buffer;
47
+ }
48
+ //# sourceMappingURL=signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.js","sourceRoot":"","sources":["../../../src/jwt/signer.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,SAAS,MAAM,iBAAiB,CAAA;AAevC,MAAM,OAAO,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,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IACnD,CAAC;CACF;;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,42 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ 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");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ 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");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _JWTVerifier_keyring;
13
+ import { InvalidTokenError } from "../errors.js";
14
+ import base64url from "../base64url.js";
15
+ export class JWTVerifier {
16
+ constructor(keyring) {
17
+ _JWTVerifier_keyring.set(this, void 0);
18
+ __classPrivateFieldSet(this, _JWTVerifier_keyring, keyring, "f");
19
+ }
20
+ async verify(token) {
21
+ const [header, payload, signature, ...rest] = token.split('.');
22
+ const jsonHeader = JSON.parse(autob(header));
23
+ const jsonPayload = JSON.parse(autob(payload));
24
+ if (!jsonPayload.iss) {
25
+ throw new InvalidTokenError("JWT missing issuer (iss) claim");
26
+ }
27
+ const key = await __classPrivateFieldGet(this, _JWTVerifier_keyring, "f").key(jsonPayload.iss, jsonHeader.kid);
28
+ const verified = await crypto.subtle.verify({
29
+ name: 'RSASSA-PKCS1-v1_5',
30
+ hash: { name: 'SHA-256' },
31
+ }, key, base64url.decode(signature), new TextEncoder().encode(`${header}.${payload}`));
32
+ if (!verified) {
33
+ throw new InvalidTokenError("Invalid signature");
34
+ }
35
+ return jsonPayload;
36
+ }
37
+ }
38
+ _JWTVerifier_keyring = new WeakMap();
39
+ function autob(data) {
40
+ return atob(data.replace(/-/g, '+').replace(/_/g, '/'));
41
+ }
42
+ //# sourceMappingURL=verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../../src/jwt/verifier.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,SAAS,MAAM,iBAAiB,CAAC;AAGxC,MAAM,OAAO,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,iBAAiB,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,SAAS,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,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;;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,45 @@
1
+ import { z } from "zod";
2
+ import { fetchAuthorizationServerMetadata } from "./discovery.js";
3
+ const JWKSchema = z.object({
4
+ kty: z.string(),
5
+ alg: z.string().optional(),
6
+ use: z.string().optional(),
7
+ kid: z.string().optional(),
8
+ });
9
+ const RSAJWKSchema = JWKSchema.extend({
10
+ n: z.string(),
11
+ e: z.string(),
12
+ });
13
+ const ECJWKSchema = JWKSchema.extend({
14
+ crv: z.string(),
15
+ x: z.string(),
16
+ y: z.string(),
17
+ });
18
+ const JWKSetSchema = z.object({
19
+ keys: z.array(z.union([RSAJWKSchema, ECJWKSchema])),
20
+ });
21
+ export class JWKSOAuthKeyring {
22
+ async key(issuer, kid) {
23
+ const authorizationServer = await fetchAuthorizationServerMetadata(issuer);
24
+ if (!authorizationServer.jwks_uri) {
25
+ throw new Error(`No JSON Web Key Set available for "${issuer}"`);
26
+ }
27
+ const response = await fetch(authorizationServer.jwks_uri);
28
+ if (!response.ok) {
29
+ throw new Error(`Failed to fetch OAuth authorization server metadata for "${issuer}"`);
30
+ }
31
+ const json = await response.json();
32
+ const jwkSet = JWKSetSchema.parse(json);
33
+ const jwk = jwkSet.keys.find((jwk) => jwk.kid === kid);
34
+ if (!jwk) {
35
+ throw new Error(`Failed to find key "${kid}" of "${issuer}"`);
36
+ }
37
+ // TODO: make this more robust to uses and algs
38
+ const key = await crypto.subtle.importKey('jwk', jwk, {
39
+ name: 'RSASSA-PKCS1-v1_5',
40
+ hash: { name: 'SHA-256' },
41
+ }, true, ['verify']);
42
+ return key;
43
+ }
44
+ }
45
+ //# sourceMappingURL=keyring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyring.js","sourceRoot":"","sources":["../../src/keyring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AAiBlE,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3B,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC;IACpC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC;IACnC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;CACpD,CAAC,CAAC;AAEH,MAAM,OAAO,gBAAgB;IAE3B,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,GAAW;QACnC,MAAM,mBAAmB,GAAG,MAAM,gCAAgC,CAAC,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"}
@@ -0,0 +1 @@
1
+ {"type": "module"}
@@ -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"}