@shware/security 0.4.3

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 (128) hide show
  1. package/README.md +1 -0
  2. package/dist/auth/index.cjs +158 -0
  3. package/dist/auth/index.cjs.map +1 -0
  4. package/dist/auth/index.d.cts +27 -0
  5. package/dist/auth/index.d.ts +27 -0
  6. package/dist/auth/index.mjs +129 -0
  7. package/dist/auth/index.mjs.map +1 -0
  8. package/dist/auth/types.cjs +19 -0
  9. package/dist/auth/types.cjs.map +1 -0
  10. package/dist/auth/types.d.cts +25 -0
  11. package/dist/auth/types.d.ts +25 -0
  12. package/dist/auth/types.mjs +1 -0
  13. package/dist/auth/types.mjs.map +1 -0
  14. package/dist/core/index.cjs +19 -0
  15. package/dist/core/index.cjs.map +1 -0
  16. package/dist/core/index.d.cts +17 -0
  17. package/dist/core/index.d.ts +17 -0
  18. package/dist/core/index.mjs +1 -0
  19. package/dist/core/index.mjs.map +1 -0
  20. package/dist/index.cjs +41 -0
  21. package/dist/index.cjs.map +1 -0
  22. package/dist/index.d.cts +11 -0
  23. package/dist/index.d.ts +11 -0
  24. package/dist/index.mjs +12 -0
  25. package/dist/index.mjs.map +1 -0
  26. package/dist/oauth2/client.cjs +110 -0
  27. package/dist/oauth2/client.cjs.map +1 -0
  28. package/dist/oauth2/client.d.cts +39 -0
  29. package/dist/oauth2/client.d.ts +39 -0
  30. package/dist/oauth2/client.mjs +74 -0
  31. package/dist/oauth2/client.mjs.map +1 -0
  32. package/dist/oauth2/error.cjs +54 -0
  33. package/dist/oauth2/error.cjs.map +1 -0
  34. package/dist/oauth2/error.d.cts +11 -0
  35. package/dist/oauth2/error.d.ts +11 -0
  36. package/dist/oauth2/error.mjs +28 -0
  37. package/dist/oauth2/error.mjs.map +1 -0
  38. package/dist/oauth2/provider/apple.cjs +85 -0
  39. package/dist/oauth2/provider/apple.cjs.map +1 -0
  40. package/dist/oauth2/provider/apple.d.cts +31 -0
  41. package/dist/oauth2/provider/apple.d.ts +31 -0
  42. package/dist/oauth2/provider/apple.mjs +50 -0
  43. package/dist/oauth2/provider/apple.mjs.map +1 -0
  44. package/dist/oauth2/provider/common.cjs +159 -0
  45. package/dist/oauth2/provider/common.cjs.map +1 -0
  46. package/dist/oauth2/provider/common.d.cts +38 -0
  47. package/dist/oauth2/provider/common.d.ts +38 -0
  48. package/dist/oauth2/provider/common.mjs +119 -0
  49. package/dist/oauth2/provider/common.mjs.map +1 -0
  50. package/dist/oauth2/provider/facebook.cjs +106 -0
  51. package/dist/oauth2/provider/facebook.cjs.map +1 -0
  52. package/dist/oauth2/provider/facebook.d.cts +29 -0
  53. package/dist/oauth2/provider/facebook.d.ts +29 -0
  54. package/dist/oauth2/provider/facebook.mjs +71 -0
  55. package/dist/oauth2/provider/facebook.mjs.map +1 -0
  56. package/dist/oauth2/provider/github.cjs +101 -0
  57. package/dist/oauth2/provider/github.cjs.map +1 -0
  58. package/dist/oauth2/provider/github.d.cts +51 -0
  59. package/dist/oauth2/provider/github.d.ts +51 -0
  60. package/dist/oauth2/provider/github.mjs +66 -0
  61. package/dist/oauth2/provider/github.mjs.map +1 -0
  62. package/dist/oauth2/provider/google.cjs +91 -0
  63. package/dist/oauth2/provider/google.cjs.map +1 -0
  64. package/dist/oauth2/provider/google.d.cts +35 -0
  65. package/dist/oauth2/provider/google.d.ts +35 -0
  66. package/dist/oauth2/provider/google.mjs +56 -0
  67. package/dist/oauth2/provider/google.mjs.map +1 -0
  68. package/dist/oauth2/provider/index.cjs +43 -0
  69. package/dist/oauth2/provider/index.cjs.map +1 -0
  70. package/dist/oauth2/provider/index.d.cts +6 -0
  71. package/dist/oauth2/provider/index.d.ts +6 -0
  72. package/dist/oauth2/provider/index.mjs +14 -0
  73. package/dist/oauth2/provider/index.mjs.map +1 -0
  74. package/dist/oauth2/provider/x.cjs +126 -0
  75. package/dist/oauth2/provider/x.cjs.map +1 -0
  76. package/dist/oauth2/provider/x.d.cts +60 -0
  77. package/dist/oauth2/provider/x.d.ts +60 -0
  78. package/dist/oauth2/provider/x.mjs +97 -0
  79. package/dist/oauth2/provider/x.mjs.map +1 -0
  80. package/dist/oauth2/schema.cjs +2 -0
  81. package/dist/oauth2/schema.cjs.map +1 -0
  82. package/dist/oauth2/schema.d.cts +2 -0
  83. package/dist/oauth2/schema.d.ts +2 -0
  84. package/dist/oauth2/schema.mjs +1 -0
  85. package/dist/oauth2/schema.mjs.map +1 -0
  86. package/dist/oauth2/types.cjs +19 -0
  87. package/dist/oauth2/types.cjs.map +1 -0
  88. package/dist/oauth2/types.d.cts +138 -0
  89. package/dist/oauth2/types.d.ts +138 -0
  90. package/dist/oauth2/types.mjs +1 -0
  91. package/dist/oauth2/types.mjs.map +1 -0
  92. package/dist/oidc/index.cjs +39 -0
  93. package/dist/oidc/index.cjs.map +1 -0
  94. package/dist/oidc/index.d.cts +10 -0
  95. package/dist/oidc/index.d.ts +10 -0
  96. package/dist/oidc/index.mjs +14 -0
  97. package/dist/oidc/index.mjs.map +1 -0
  98. package/dist/session/__test__/redis-session.test.cjs +94 -0
  99. package/dist/session/__test__/redis-session.test.cjs.map +1 -0
  100. package/dist/session/__test__/redis-session.test.d.cts +2 -0
  101. package/dist/session/__test__/redis-session.test.d.ts +2 -0
  102. package/dist/session/__test__/redis-session.test.mjs +70 -0
  103. package/dist/session/__test__/redis-session.test.mjs.map +1 -0
  104. package/dist/session/index.cjs +33 -0
  105. package/dist/session/index.cjs.map +1 -0
  106. package/dist/session/index.d.cts +4 -0
  107. package/dist/session/index.d.ts +4 -0
  108. package/dist/session/index.mjs +7 -0
  109. package/dist/session/index.mjs.map +1 -0
  110. package/dist/session/redis-session.cjs +403 -0
  111. package/dist/session/redis-session.cjs.map +1 -0
  112. package/dist/session/redis-session.d.cts +73 -0
  113. package/dist/session/redis-session.d.ts +73 -0
  114. package/dist/session/redis-session.mjs +377 -0
  115. package/dist/session/redis-session.mjs.map +1 -0
  116. package/dist/session/types.cjs +19 -0
  117. package/dist/session/types.cjs.map +1 -0
  118. package/dist/session/types.d.cts +39 -0
  119. package/dist/session/types.d.ts +39 -0
  120. package/dist/session/types.mjs +1 -0
  121. package/dist/session/types.mjs.map +1 -0
  122. package/dist/utils/http.cjs +63 -0
  123. package/dist/utils/http.cjs.map +1 -0
  124. package/dist/utils/http.d.cts +17 -0
  125. package/dist/utils/http.d.ts +17 -0
  126. package/dist/utils/http.mjs +34 -0
  127. package/dist/utils/http.mjs.map +1 -0
  128. package/package.json +44 -0
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/oauth2/client.ts
31
+ var client_exports = {};
32
+ __export(client_exports, {
33
+ OAuth2Client: () => OAuth2Client,
34
+ oauth2RedirectQuerySchema: () => oauth2RedirectQuerySchema
35
+ });
36
+ module.exports = __toCommonJS(client_exports);
37
+ var import_zod = require("zod");
38
+ var import_tiny_invariant = __toESM(require("tiny-invariant"), 1);
39
+ var oauth2RedirectQuerySchema = import_zod.z.object({
40
+ code: import_zod.z.string(),
41
+ state: import_zod.z.string(),
42
+ error: import_zod.z.string().optional(),
43
+ error_description: import_zod.z.string().optional(),
44
+ error_uri: import_zod.z.string().optional()
45
+ });
46
+ var OAuth2Client = class {
47
+ config;
48
+ constructor(config) {
49
+ this.config = config;
50
+ }
51
+ get baseUri() {
52
+ return this.config.baseUri;
53
+ }
54
+ get errorUri() {
55
+ return this.config.errorUri;
56
+ }
57
+ getClientConfig(registrationId) {
58
+ const registration = this.config.registration[registrationId];
59
+ (0, import_tiny_invariant.default)(registration, `Registration ${registrationId} not found`);
60
+ const provider = this.config.provider[registration.provider ?? registrationId];
61
+ (0, import_tiny_invariant.default)(provider, `Provider ${registration.provider ?? registrationId} not found`);
62
+ return { registration, provider };
63
+ }
64
+ createAuthorizationUri(registrationId, state, codeVerifier) {
65
+ const { provider, registration } = this.getClientConfig(registrationId);
66
+ const { baseUri } = this.config;
67
+ const { scope, clientId, redirectUri } = registration;
68
+ return provider.createAuthorizationUri({
69
+ state,
70
+ scope,
71
+ clientId,
72
+ codeVerifier,
73
+ redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`
74
+ });
75
+ }
76
+ async exchangeAuthorizationCode(registrationId, code, codeVerifier) {
77
+ const { provider, registration } = this.getClientConfig(registrationId);
78
+ const { baseUri } = this.config;
79
+ const { clientId, clientSecret, redirectUri } = registration;
80
+ return provider.exchangeAuthorizationCode({
81
+ code,
82
+ codeVerifier,
83
+ clientId,
84
+ clientSecret,
85
+ redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`
86
+ });
87
+ }
88
+ async getUserInfo(registrationId, token) {
89
+ const { provider } = this.getClientConfig(registrationId);
90
+ return provider.getUserInfo(token);
91
+ }
92
+ async refreshAccessToken(registrationId, refreshToken) {
93
+ const { provider, registration } = this.getClientConfig(registrationId);
94
+ const { clientId, clientSecret } = registration;
95
+ (0, import_tiny_invariant.default)(provider.refreshAccessToken, "Provider does not support refreshAccessToken");
96
+ return provider.refreshAccessToken({ refreshToken, clientId, clientSecret });
97
+ }
98
+ async revokeToken(registrationId, token) {
99
+ const { provider, registration } = this.getClientConfig(registrationId);
100
+ const { clientId, clientSecret } = registration;
101
+ (0, import_tiny_invariant.default)(provider.revokeToken, "Provider does not support revokeToken");
102
+ await provider.revokeToken({ token, clientId, clientSecret });
103
+ }
104
+ };
105
+ // Annotate the CommonJS export names for ESM import in node:
106
+ 0 && (module.exports = {
107
+ OAuth2Client,
108
+ oauth2RedirectQuerySchema
109
+ });
110
+ //# sourceMappingURL=client.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/oauth2/client.ts"],"sourcesContent":["import { z } from 'zod';\nimport invariant from 'tiny-invariant';\nimport { OAuth2ClientConfig, OAuth2Token } from './types';\n\nexport const oauth2RedirectQuerySchema = z.object({\n code: z.string(),\n state: z.string(),\n error: z.string().optional(),\n error_description: z.string().optional(),\n error_uri: z.string().optional(),\n});\n\nexport class OAuth2Client {\n private config: OAuth2ClientConfig;\n constructor(config: OAuth2ClientConfig) {\n this.config = config;\n }\n\n get baseUri() {\n return this.config.baseUri;\n }\n\n get errorUri() {\n return this.config.errorUri;\n }\n\n getClientConfig(registrationId: string) {\n const registration = this.config.registration[registrationId];\n invariant(registration, `Registration ${registrationId} not found`);\n const provider = this.config.provider[registration.provider ?? registrationId];\n invariant(provider, `Provider ${registration.provider ?? registrationId} not found`);\n return { registration, provider };\n }\n\n createAuthorizationUri(registrationId: string, state: string, codeVerifier?: string): URL {\n const { provider, registration } = this.getClientConfig(registrationId);\n\n const { baseUri } = this.config;\n const { scope, clientId, redirectUri } = registration;\n return provider.createAuthorizationUri({\n state,\n scope,\n clientId,\n codeVerifier,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n });\n }\n\n async exchangeAuthorizationCode(\n registrationId: string,\n code: string,\n codeVerifier?: string\n ): Promise<OAuth2Token> {\n const { provider, registration } = this.getClientConfig(registrationId);\n\n const { baseUri } = this.config;\n const { clientId, clientSecret, redirectUri } = registration;\n return provider.exchangeAuthorizationCode({\n code,\n codeVerifier,\n clientId,\n clientSecret,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n });\n }\n\n async getUserInfo(registrationId: string, token: OAuth2Token) {\n const { provider } = this.getClientConfig(registrationId);\n return provider.getUserInfo(token);\n }\n\n async refreshAccessToken(registrationId: string, refreshToken: string): Promise<OAuth2Token> {\n const { provider, registration } = this.getClientConfig(registrationId);\n const { clientId, clientSecret } = registration;\n\n invariant(provider.refreshAccessToken, 'Provider does not support refreshAccessToken');\n return provider.refreshAccessToken({ refreshToken, clientId, clientSecret });\n }\n\n async revokeToken(registrationId: string, token: string) {\n const { provider, registration } = this.getClientConfig(registrationId);\n const { clientId, clientSecret } = registration;\n\n invariant(provider.revokeToken, 'Provider does not support revokeToken');\n await provider.revokeToken({ token, clientId, clientSecret });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAkB;AAClB,4BAAsB;AAGf,IAAM,4BAA4B,aAAE,OAAO;AAAA,EAChD,MAAM,aAAE,OAAO;AAAA,EACf,OAAO,aAAE,OAAO;AAAA,EAChB,OAAO,aAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,mBAAmB,aAAE,OAAO,EAAE,SAAS;AAAA,EACvC,WAAW,aAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAEM,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACR,YAAY,QAA4B;AACtC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,gBAAgB,gBAAwB;AACtC,UAAM,eAAe,KAAK,OAAO,aAAa,cAAc;AAC5D,8BAAAA,SAAU,cAAc,gBAAgB,cAAc,YAAY;AAClE,UAAM,WAAW,KAAK,OAAO,SAAS,aAAa,YAAY,cAAc;AAC7E,8BAAAA,SAAU,UAAU,YAAY,aAAa,YAAY,cAAc,YAAY;AACnF,WAAO,EAAE,cAAc,SAAS;AAAA,EAClC;AAAA,EAEA,uBAAuB,gBAAwB,OAAe,cAA4B;AACxF,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AAEtE,UAAM,EAAE,QAAQ,IAAI,KAAK;AACzB,UAAM,EAAE,OAAO,UAAU,YAAY,IAAI;AACzC,WAAO,SAAS,uBAAuB;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,eAAe,GAAG,OAAO,sBAAsB,cAAc;AAAA,IAC5E,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,0BACJ,gBACA,MACA,cACsB;AACtB,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AAEtE,UAAM,EAAE,QAAQ,IAAI,KAAK;AACzB,UAAM,EAAE,UAAU,cAAc,YAAY,IAAI;AAChD,WAAO,SAAS,0BAA0B;AAAA,MACxC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,eAAe,GAAG,OAAO,sBAAsB,cAAc;AAAA,IAC5E,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,gBAAwB,OAAoB;AAC5D,UAAM,EAAE,SAAS,IAAI,KAAK,gBAAgB,cAAc;AACxD,WAAO,SAAS,YAAY,KAAK;AAAA,EACnC;AAAA,EAEA,MAAM,mBAAmB,gBAAwB,cAA4C;AAC3F,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AACtE,UAAM,EAAE,UAAU,aAAa,IAAI;AAEnC,8BAAAA,SAAU,SAAS,oBAAoB,8CAA8C;AACrF,WAAO,SAAS,mBAAmB,EAAE,cAAc,UAAU,aAAa,CAAC;AAAA,EAC7E;AAAA,EAEA,MAAM,YAAY,gBAAwB,OAAe;AACvD,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AACtE,UAAM,EAAE,UAAU,aAAa,IAAI;AAEnC,8BAAAA,SAAU,SAAS,aAAa,uCAAuC;AACvE,UAAM,SAAS,YAAY,EAAE,OAAO,UAAU,aAAa,CAAC;AAAA,EAC9D;AACF;","names":["invariant"]}
@@ -0,0 +1,39 @@
1
+ import { OAuth2ClientConfig, Registration, Provider, OAuth2Token, UserInfo } from './types.cjs';
2
+ import { z } from 'zod';
3
+
4
+ declare const oauth2RedirectQuerySchema: z.ZodObject<{
5
+ code: z.ZodString;
6
+ state: z.ZodString;
7
+ error: z.ZodOptional<z.ZodString>;
8
+ error_description: z.ZodOptional<z.ZodString>;
9
+ error_uri: z.ZodOptional<z.ZodString>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ code: string;
12
+ state: string;
13
+ error?: string | undefined;
14
+ error_description?: string | undefined;
15
+ error_uri?: string | undefined;
16
+ }, {
17
+ code: string;
18
+ state: string;
19
+ error?: string | undefined;
20
+ error_description?: string | undefined;
21
+ error_uri?: string | undefined;
22
+ }>;
23
+ declare class OAuth2Client {
24
+ private config;
25
+ constructor(config: OAuth2ClientConfig);
26
+ get baseUri(): string;
27
+ get errorUri(): string;
28
+ getClientConfig(registrationId: string): {
29
+ registration: Registration;
30
+ provider: Provider<Record<string, any>>;
31
+ };
32
+ createAuthorizationUri(registrationId: string, state: string, codeVerifier?: string): URL;
33
+ exchangeAuthorizationCode(registrationId: string, code: string, codeVerifier?: string): Promise<OAuth2Token>;
34
+ getUserInfo(registrationId: string, token: OAuth2Token): Promise<UserInfo<Record<string, any>>>;
35
+ refreshAccessToken(registrationId: string, refreshToken: string): Promise<OAuth2Token>;
36
+ revokeToken(registrationId: string, token: string): Promise<void>;
37
+ }
38
+
39
+ export { OAuth2Client, oauth2RedirectQuerySchema };
@@ -0,0 +1,39 @@
1
+ import { OAuth2ClientConfig, Registration, Provider, OAuth2Token, UserInfo } from './types.js';
2
+ import { z } from 'zod';
3
+
4
+ declare const oauth2RedirectQuerySchema: z.ZodObject<{
5
+ code: z.ZodString;
6
+ state: z.ZodString;
7
+ error: z.ZodOptional<z.ZodString>;
8
+ error_description: z.ZodOptional<z.ZodString>;
9
+ error_uri: z.ZodOptional<z.ZodString>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ code: string;
12
+ state: string;
13
+ error?: string | undefined;
14
+ error_description?: string | undefined;
15
+ error_uri?: string | undefined;
16
+ }, {
17
+ code: string;
18
+ state: string;
19
+ error?: string | undefined;
20
+ error_description?: string | undefined;
21
+ error_uri?: string | undefined;
22
+ }>;
23
+ declare class OAuth2Client {
24
+ private config;
25
+ constructor(config: OAuth2ClientConfig);
26
+ get baseUri(): string;
27
+ get errorUri(): string;
28
+ getClientConfig(registrationId: string): {
29
+ registration: Registration;
30
+ provider: Provider<Record<string, any>>;
31
+ };
32
+ createAuthorizationUri(registrationId: string, state: string, codeVerifier?: string): URL;
33
+ exchangeAuthorizationCode(registrationId: string, code: string, codeVerifier?: string): Promise<OAuth2Token>;
34
+ getUserInfo(registrationId: string, token: OAuth2Token): Promise<UserInfo<Record<string, any>>>;
35
+ refreshAccessToken(registrationId: string, refreshToken: string): Promise<OAuth2Token>;
36
+ revokeToken(registrationId: string, token: string): Promise<void>;
37
+ }
38
+
39
+ export { OAuth2Client, oauth2RedirectQuerySchema };
@@ -0,0 +1,74 @@
1
+ // src/oauth2/client.ts
2
+ import { z } from "zod";
3
+ import invariant from "tiny-invariant";
4
+ var oauth2RedirectQuerySchema = z.object({
5
+ code: z.string(),
6
+ state: z.string(),
7
+ error: z.string().optional(),
8
+ error_description: z.string().optional(),
9
+ error_uri: z.string().optional()
10
+ });
11
+ var OAuth2Client = class {
12
+ config;
13
+ constructor(config) {
14
+ this.config = config;
15
+ }
16
+ get baseUri() {
17
+ return this.config.baseUri;
18
+ }
19
+ get errorUri() {
20
+ return this.config.errorUri;
21
+ }
22
+ getClientConfig(registrationId) {
23
+ const registration = this.config.registration[registrationId];
24
+ invariant(registration, `Registration ${registrationId} not found`);
25
+ const provider = this.config.provider[registration.provider ?? registrationId];
26
+ invariant(provider, `Provider ${registration.provider ?? registrationId} not found`);
27
+ return { registration, provider };
28
+ }
29
+ createAuthorizationUri(registrationId, state, codeVerifier) {
30
+ const { provider, registration } = this.getClientConfig(registrationId);
31
+ const { baseUri } = this.config;
32
+ const { scope, clientId, redirectUri } = registration;
33
+ return provider.createAuthorizationUri({
34
+ state,
35
+ scope,
36
+ clientId,
37
+ codeVerifier,
38
+ redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`
39
+ });
40
+ }
41
+ async exchangeAuthorizationCode(registrationId, code, codeVerifier) {
42
+ const { provider, registration } = this.getClientConfig(registrationId);
43
+ const { baseUri } = this.config;
44
+ const { clientId, clientSecret, redirectUri } = registration;
45
+ return provider.exchangeAuthorizationCode({
46
+ code,
47
+ codeVerifier,
48
+ clientId,
49
+ clientSecret,
50
+ redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`
51
+ });
52
+ }
53
+ async getUserInfo(registrationId, token) {
54
+ const { provider } = this.getClientConfig(registrationId);
55
+ return provider.getUserInfo(token);
56
+ }
57
+ async refreshAccessToken(registrationId, refreshToken) {
58
+ const { provider, registration } = this.getClientConfig(registrationId);
59
+ const { clientId, clientSecret } = registration;
60
+ invariant(provider.refreshAccessToken, "Provider does not support refreshAccessToken");
61
+ return provider.refreshAccessToken({ refreshToken, clientId, clientSecret });
62
+ }
63
+ async revokeToken(registrationId, token) {
64
+ const { provider, registration } = this.getClientConfig(registrationId);
65
+ const { clientId, clientSecret } = registration;
66
+ invariant(provider.revokeToken, "Provider does not support revokeToken");
67
+ await provider.revokeToken({ token, clientId, clientSecret });
68
+ }
69
+ };
70
+ export {
71
+ OAuth2Client,
72
+ oauth2RedirectQuerySchema
73
+ };
74
+ //# sourceMappingURL=client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/oauth2/client.ts"],"sourcesContent":["import { z } from 'zod';\nimport invariant from 'tiny-invariant';\nimport { OAuth2ClientConfig, OAuth2Token } from './types';\n\nexport const oauth2RedirectQuerySchema = z.object({\n code: z.string(),\n state: z.string(),\n error: z.string().optional(),\n error_description: z.string().optional(),\n error_uri: z.string().optional(),\n});\n\nexport class OAuth2Client {\n private config: OAuth2ClientConfig;\n constructor(config: OAuth2ClientConfig) {\n this.config = config;\n }\n\n get baseUri() {\n return this.config.baseUri;\n }\n\n get errorUri() {\n return this.config.errorUri;\n }\n\n getClientConfig(registrationId: string) {\n const registration = this.config.registration[registrationId];\n invariant(registration, `Registration ${registrationId} not found`);\n const provider = this.config.provider[registration.provider ?? registrationId];\n invariant(provider, `Provider ${registration.provider ?? registrationId} not found`);\n return { registration, provider };\n }\n\n createAuthorizationUri(registrationId: string, state: string, codeVerifier?: string): URL {\n const { provider, registration } = this.getClientConfig(registrationId);\n\n const { baseUri } = this.config;\n const { scope, clientId, redirectUri } = registration;\n return provider.createAuthorizationUri({\n state,\n scope,\n clientId,\n codeVerifier,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n });\n }\n\n async exchangeAuthorizationCode(\n registrationId: string,\n code: string,\n codeVerifier?: string\n ): Promise<OAuth2Token> {\n const { provider, registration } = this.getClientConfig(registrationId);\n\n const { baseUri } = this.config;\n const { clientId, clientSecret, redirectUri } = registration;\n return provider.exchangeAuthorizationCode({\n code,\n codeVerifier,\n clientId,\n clientSecret,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n });\n }\n\n async getUserInfo(registrationId: string, token: OAuth2Token) {\n const { provider } = this.getClientConfig(registrationId);\n return provider.getUserInfo(token);\n }\n\n async refreshAccessToken(registrationId: string, refreshToken: string): Promise<OAuth2Token> {\n const { provider, registration } = this.getClientConfig(registrationId);\n const { clientId, clientSecret } = registration;\n\n invariant(provider.refreshAccessToken, 'Provider does not support refreshAccessToken');\n return provider.refreshAccessToken({ refreshToken, clientId, clientSecret });\n }\n\n async revokeToken(registrationId: string, token: string) {\n const { provider, registration } = this.getClientConfig(registrationId);\n const { clientId, clientSecret } = registration;\n\n invariant(provider.revokeToken, 'Provider does not support revokeToken');\n await provider.revokeToken({ token, clientId, clientSecret });\n }\n}\n"],"mappings":";AAAA,SAAS,SAAS;AAClB,OAAO,eAAe;AAGf,IAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,MAAM,EAAE,OAAO;AAAA,EACf,OAAO,EAAE,OAAO;AAAA,EAChB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAEM,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACR,YAAY,QAA4B;AACtC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,gBAAgB,gBAAwB;AACtC,UAAM,eAAe,KAAK,OAAO,aAAa,cAAc;AAC5D,cAAU,cAAc,gBAAgB,cAAc,YAAY;AAClE,UAAM,WAAW,KAAK,OAAO,SAAS,aAAa,YAAY,cAAc;AAC7E,cAAU,UAAU,YAAY,aAAa,YAAY,cAAc,YAAY;AACnF,WAAO,EAAE,cAAc,SAAS;AAAA,EAClC;AAAA,EAEA,uBAAuB,gBAAwB,OAAe,cAA4B;AACxF,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AAEtE,UAAM,EAAE,QAAQ,IAAI,KAAK;AACzB,UAAM,EAAE,OAAO,UAAU,YAAY,IAAI;AACzC,WAAO,SAAS,uBAAuB;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,eAAe,GAAG,OAAO,sBAAsB,cAAc;AAAA,IAC5E,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,0BACJ,gBACA,MACA,cACsB;AACtB,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AAEtE,UAAM,EAAE,QAAQ,IAAI,KAAK;AACzB,UAAM,EAAE,UAAU,cAAc,YAAY,IAAI;AAChD,WAAO,SAAS,0BAA0B;AAAA,MACxC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,eAAe,GAAG,OAAO,sBAAsB,cAAc;AAAA,IAC5E,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,gBAAwB,OAAoB;AAC5D,UAAM,EAAE,SAAS,IAAI,KAAK,gBAAgB,cAAc;AACxD,WAAO,SAAS,YAAY,KAAK;AAAA,EACnC;AAAA,EAEA,MAAM,mBAAmB,gBAAwB,cAA4C;AAC3F,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AACtE,UAAM,EAAE,UAAU,aAAa,IAAI;AAEnC,cAAU,SAAS,oBAAoB,8CAA8C;AACrF,WAAO,SAAS,mBAAmB,EAAE,cAAc,UAAU,aAAa,CAAC;AAAA,EAC7E;AAAA,EAEA,MAAM,YAAY,gBAAwB,OAAe;AACvD,UAAM,EAAE,UAAU,aAAa,IAAI,KAAK,gBAAgB,cAAc;AACtE,UAAM,EAAE,UAAU,aAAa,IAAI;AAEnC,cAAU,SAAS,aAAa,uCAAuC;AACvE,UAAM,SAAS,YAAY,EAAE,OAAO,UAAU,aAAa,CAAC;AAAA,EAC9D;AACF;","names":[]}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/oauth2/error.ts
21
+ var error_exports = {};
22
+ __export(error_exports, {
23
+ AuthenticationError: () => AuthenticationError,
24
+ OAuth2Error: () => OAuth2Error
25
+ });
26
+ module.exports = __toCommonJS(error_exports);
27
+ var OAuth2Error = class _OAuth2Error extends Error {
28
+ status;
29
+ error;
30
+ constructor(status, error, message) {
31
+ super(message ?? `OAuth2 error: ${error}`);
32
+ this.status = status;
33
+ this.error = error;
34
+ if (Error.captureStackTrace) {
35
+ Error.captureStackTrace(this, _OAuth2Error);
36
+ }
37
+ Object.setPrototypeOf(this, _OAuth2Error.prototype);
38
+ }
39
+ };
40
+ var AuthenticationError = class _AuthenticationError extends Error {
41
+ constructor(message) {
42
+ super(message);
43
+ if (Error.captureStackTrace) {
44
+ Error.captureStackTrace(this, _AuthenticationError);
45
+ }
46
+ Object.setPrototypeOf(this, _AuthenticationError.prototype);
47
+ }
48
+ };
49
+ // Annotate the CommonJS export names for ESM import in node:
50
+ 0 && (module.exports = {
51
+ AuthenticationError,
52
+ OAuth2Error
53
+ });
54
+ //# sourceMappingURL=error.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/oauth2/error.ts"],"sourcesContent":["export type OAuth2ErrorType =\n | 'invalid_request' // 400\n | 'invalid_client' // 401\n | 'invalid_grant' // 400\n | 'invalid_token' // 401\n | 'invalid_scope' // 400\n | 'unauthorized_client' // 401\n | 'unsupported_grant_type' // 400\n | 'unsupported_response_type' // 400\n | 'insufficient_scope' // 403\n | 'redirect_uri_mismatch' // 400\n | 'access_denied' // 400\n // added\n | 'server_error'\n | string;\n\nexport class OAuth2Error extends Error {\n readonly status: number;\n readonly error: OAuth2ErrorType;\n\n constructor(status: number, error: OAuth2ErrorType, message?: string) {\n super(message ?? `OAuth2 error: ${error}`);\n this.status = status;\n this.error = error;\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, OAuth2Error);\n }\n Object.setPrototypeOf(this, OAuth2Error.prototype);\n }\n}\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, AuthenticationError);\n }\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBO,IAAM,cAAN,MAAM,qBAAoB,MAAM;AAAA,EAC5B;AAAA,EACA;AAAA,EAET,YAAY,QAAgB,OAAwB,SAAkB;AACpE,UAAM,WAAW,iBAAiB,KAAK,EAAE;AACzC,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,QAAK,MAAc,mBAAmB;AACpC,MAAC,MAAc,kBAAkB,MAAM,YAAW;AAAA,IACpD;AACA,WAAO,eAAe,MAAM,aAAY,SAAS;AAAA,EACnD;AACF;AAEO,IAAM,sBAAN,MAAM,6BAA4B,MAAM;AAAA,EAC7C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,QAAK,MAAc,mBAAmB;AACpC,MAAC,MAAc,kBAAkB,MAAM,oBAAmB;AAAA,IAC5D;AACA,WAAO,eAAe,MAAM,qBAAoB,SAAS;AAAA,EAC3D;AACF;","names":[]}
@@ -0,0 +1,11 @@
1
+ type OAuth2ErrorType = 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'invalid_token' | 'invalid_scope' | 'unauthorized_client' | 'unsupported_grant_type' | 'unsupported_response_type' | 'insufficient_scope' | 'redirect_uri_mismatch' | 'access_denied' | 'server_error' | string;
2
+ declare class OAuth2Error extends Error {
3
+ readonly status: number;
4
+ readonly error: OAuth2ErrorType;
5
+ constructor(status: number, error: OAuth2ErrorType, message?: string);
6
+ }
7
+ declare class AuthenticationError extends Error {
8
+ constructor(message: string);
9
+ }
10
+
11
+ export { AuthenticationError, OAuth2Error, type OAuth2ErrorType };
@@ -0,0 +1,11 @@
1
+ type OAuth2ErrorType = 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'invalid_token' | 'invalid_scope' | 'unauthorized_client' | 'unsupported_grant_type' | 'unsupported_response_type' | 'insufficient_scope' | 'redirect_uri_mismatch' | 'access_denied' | 'server_error' | string;
2
+ declare class OAuth2Error extends Error {
3
+ readonly status: number;
4
+ readonly error: OAuth2ErrorType;
5
+ constructor(status: number, error: OAuth2ErrorType, message?: string);
6
+ }
7
+ declare class AuthenticationError extends Error {
8
+ constructor(message: string);
9
+ }
10
+
11
+ export { AuthenticationError, OAuth2Error, type OAuth2ErrorType };
@@ -0,0 +1,28 @@
1
+ // src/oauth2/error.ts
2
+ var OAuth2Error = class _OAuth2Error extends Error {
3
+ status;
4
+ error;
5
+ constructor(status, error, message) {
6
+ super(message ?? `OAuth2 error: ${error}`);
7
+ this.status = status;
8
+ this.error = error;
9
+ if (Error.captureStackTrace) {
10
+ Error.captureStackTrace(this, _OAuth2Error);
11
+ }
12
+ Object.setPrototypeOf(this, _OAuth2Error.prototype);
13
+ }
14
+ };
15
+ var AuthenticationError = class _AuthenticationError extends Error {
16
+ constructor(message) {
17
+ super(message);
18
+ if (Error.captureStackTrace) {
19
+ Error.captureStackTrace(this, _AuthenticationError);
20
+ }
21
+ Object.setPrototypeOf(this, _AuthenticationError.prototype);
22
+ }
23
+ };
24
+ export {
25
+ AuthenticationError,
26
+ OAuth2Error
27
+ };
28
+ //# sourceMappingURL=error.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/oauth2/error.ts"],"sourcesContent":["export type OAuth2ErrorType =\n | 'invalid_request' // 400\n | 'invalid_client' // 401\n | 'invalid_grant' // 400\n | 'invalid_token' // 401\n | 'invalid_scope' // 400\n | 'unauthorized_client' // 401\n | 'unsupported_grant_type' // 400\n | 'unsupported_response_type' // 400\n | 'insufficient_scope' // 403\n | 'redirect_uri_mismatch' // 400\n | 'access_denied' // 400\n // added\n | 'server_error'\n | string;\n\nexport class OAuth2Error extends Error {\n readonly status: number;\n readonly error: OAuth2ErrorType;\n\n constructor(status: number, error: OAuth2ErrorType, message?: string) {\n super(message ?? `OAuth2 error: ${error}`);\n this.status = status;\n this.error = error;\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, OAuth2Error);\n }\n Object.setPrototypeOf(this, OAuth2Error.prototype);\n }\n}\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, AuthenticationError);\n }\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n"],"mappings":";AAgBO,IAAM,cAAN,MAAM,qBAAoB,MAAM;AAAA,EAC5B;AAAA,EACA;AAAA,EAET,YAAY,QAAgB,OAAwB,SAAkB;AACpE,UAAM,WAAW,iBAAiB,KAAK,EAAE;AACzC,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,QAAK,MAAc,mBAAmB;AACpC,MAAC,MAAc,kBAAkB,MAAM,YAAW;AAAA,IACpD;AACA,WAAO,eAAe,MAAM,aAAY,SAAS;AAAA,EACnD;AACF;AAEO,IAAM,sBAAN,MAAM,6BAA4B,MAAM;AAAA,EAC7C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,QAAK,MAAc,mBAAmB;AACpC,MAAC,MAAc,kBAAkB,MAAM,oBAAmB;AAAA,IAC5D;AACA,WAAO,eAAe,MAAM,qBAAoB,SAAS;AAAA,EAC3D;AACF;","names":[]}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/oauth2/provider/apple.ts
31
+ var apple_exports = {};
32
+ __export(apple_exports, {
33
+ apple: () => apple
34
+ });
35
+ module.exports = __toCommonJS(apple_exports);
36
+ var import_tiny_invariant = __toESM(require("tiny-invariant"), 1);
37
+ var import_error = require("../error.cjs");
38
+ var import_common = require("./common.cjs");
39
+ function apple() {
40
+ return {
41
+ // important notice: response_mode=form_post is required for apple
42
+ authorizationUri: "https://appleid.apple.com/auth/authorize?response_mode=form_post",
43
+ tokenUri: "https://appleid.apple.com/auth/token",
44
+ jwkSetUri: "https://appleid.apple.com/auth/keys",
45
+ userNameAttribute: "sub",
46
+ defaultScope: ["openid", "name", "email"],
47
+ createAuthorizationUri({ codeVerifier, ...params }) {
48
+ return (0, import_common.createAuthorizationUri)({
49
+ ...params,
50
+ scope: params.scope ?? this.defaultScope,
51
+ authorizationUri: this.authorizationUri
52
+ });
53
+ },
54
+ async exchangeAuthorizationCode({ codeVerifier, ...params }) {
55
+ const response = await (0, import_common.exchangeAuthorizationCode)({ ...params, tokenUri: this.tokenUri });
56
+ if (!response.ok) {
57
+ const { error } = await response.json();
58
+ throw new import_error.OAuth2Error(response.status, error);
59
+ }
60
+ return await response.json();
61
+ },
62
+ async getUserInfo({ id_token }) {
63
+ (0, import_tiny_invariant.default)(id_token, "id_token is required");
64
+ (0, import_tiny_invariant.default)(this.jwkSetUri, "jwkSetUri is required");
65
+ const data = await (0, import_common.verifyIdToken)(id_token, this.jwkSetUri);
66
+ return {
67
+ data,
68
+ claims: {
69
+ sub: data.sub,
70
+ name: data.name,
71
+ email: data.email,
72
+ email_verified: true,
73
+ picture: data.picture,
74
+ given_name: data.user?.name.firstName,
75
+ family_name: data.user?.name.lastName
76
+ }
77
+ };
78
+ }
79
+ };
80
+ }
81
+ // Annotate the CommonJS export names for ESM import in node:
82
+ 0 && (module.exports = {
83
+ apple
84
+ });
85
+ //# sourceMappingURL=apple.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/oauth2/provider/apple.ts"],"sourcesContent":["import invariant from 'tiny-invariant';\nimport { Provider } from '../types';\nimport { OAuth2Error } from '../error';\nimport { createAuthorizationUri, exchangeAuthorizationCode, verifyIdToken } from './common';\n\n// ref: https://account.apple.com/.well-known/openid-configuration\nexport function apple(): Provider<AppleUserInfo> {\n return {\n // important notice: response_mode=form_post is required for apple\n authorizationUri: 'https://appleid.apple.com/auth/authorize?response_mode=form_post',\n tokenUri: 'https://appleid.apple.com/auth/token',\n jwkSetUri: 'https://appleid.apple.com/auth/keys',\n userNameAttribute: 'sub',\n defaultScope: ['openid', 'name', 'email'],\n createAuthorizationUri({ codeVerifier, ...params }) {\n return createAuthorizationUri({\n ...params,\n scope: params.scope ?? this.defaultScope,\n authorizationUri: this.authorizationUri,\n });\n },\n async exchangeAuthorizationCode({ codeVerifier, ...params }) {\n const response = await exchangeAuthorizationCode({ ...params, tokenUri: this.tokenUri });\n if (!response.ok) {\n const { error } = (await response.json()) as AppleErrorResponse;\n throw new OAuth2Error(response.status, error);\n }\n return (await response.json()) as AppleOAuth2Token;\n },\n async getUserInfo({ id_token }) {\n invariant(id_token, 'id_token is required');\n invariant(this.jwkSetUri, 'jwkSetUri is required');\n const data = await verifyIdToken<AppleUserInfo>(id_token, this.jwkSetUri);\n return {\n data,\n claims: {\n sub: data.sub,\n name: data.name,\n email: data.email,\n email_verified: true,\n picture: data.picture,\n given_name: data.user?.name.firstName,\n family_name: data.user?.name.lastName,\n },\n };\n },\n };\n}\n\n// https://developer.apple.com/documentation/sign_in_with_apple/authenticating-users-with-sign-in-with-apple\nexport interface AppleUserInfo {\n sub: string;\n email: string;\n email_verified: true | 'true';\n is_private_email: boolean;\n real_user_status: number;\n name: string;\n picture: string;\n user?: {\n name: { firstName: string; lastName: string };\n email: string;\n };\n}\n\n// https://developer.apple.com/documentation/devicemanagement/implementing-the-oauth2-authentication-user-enrollment-flow\n// https://developer.apple.com/documentation/sign_in_with_apple/generate_and_validate_tokens\nexport interface AppleOAuth2Token {\n access_token: string;\n token_type: string;\n expires_in: number;\n refresh_token: string;\n id_token: string;\n}\n\n// https://developer.apple.com/documentation/sign_in_with_apple/errorresponse\nexport interface AppleErrorResponse {\n error:\n | 'invalid_request'\n | 'invalid_client'\n | 'invalid_grant'\n | 'unauthorized_client'\n | 'unsupported_grant_type'\n | 'invalid_scope';\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAsB;AAEtB,mBAA4B;AAC5B,oBAAiF;AAG1E,SAAS,QAAiC;AAC/C,SAAO;AAAA;AAAA,IAEL,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,cAAc,CAAC,UAAU,QAAQ,OAAO;AAAA,IACxC,uBAAuB,EAAE,cAAc,GAAG,OAAO,GAAG;AAClD,iBAAO,sCAAuB;AAAA,QAC5B,GAAG;AAAA,QACH,OAAO,OAAO,SAAS,KAAK;AAAA,QAC5B,kBAAkB,KAAK;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,IACA,MAAM,0BAA0B,EAAE,cAAc,GAAG,OAAO,GAAG;AAC3D,YAAM,WAAW,UAAM,yCAA0B,EAAE,GAAG,QAAQ,UAAU,KAAK,SAAS,CAAC;AACvF,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,EAAE,MAAM,IAAK,MAAM,SAAS,KAAK;AACvC,cAAM,IAAI,yBAAY,SAAS,QAAQ,KAAK;AAAA,MAC9C;AACA,aAAQ,MAAM,SAAS,KAAK;AAAA,IAC9B;AAAA,IACA,MAAM,YAAY,EAAE,SAAS,GAAG;AAC9B,gCAAAA,SAAU,UAAU,sBAAsB;AAC1C,gCAAAA,SAAU,KAAK,WAAW,uBAAuB;AACjD,YAAM,OAAO,UAAM,6BAA6B,UAAU,KAAK,SAAS;AACxE,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,UACN,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,OAAO,KAAK;AAAA,UACZ,gBAAgB;AAAA,UAChB,SAAS,KAAK;AAAA,UACd,YAAY,KAAK,MAAM,KAAK;AAAA,UAC5B,aAAa,KAAK,MAAM,KAAK;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":["invariant"]}
@@ -0,0 +1,31 @@
1
+ import { Provider } from '../types.cjs';
2
+
3
+ declare function apple(): Provider<AppleUserInfo>;
4
+ interface AppleUserInfo {
5
+ sub: string;
6
+ email: string;
7
+ email_verified: true | 'true';
8
+ is_private_email: boolean;
9
+ real_user_status: number;
10
+ name: string;
11
+ picture: string;
12
+ user?: {
13
+ name: {
14
+ firstName: string;
15
+ lastName: string;
16
+ };
17
+ email: string;
18
+ };
19
+ }
20
+ interface AppleOAuth2Token {
21
+ access_token: string;
22
+ token_type: string;
23
+ expires_in: number;
24
+ refresh_token: string;
25
+ id_token: string;
26
+ }
27
+ interface AppleErrorResponse {
28
+ error: 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'unauthorized_client' | 'unsupported_grant_type' | 'invalid_scope';
29
+ }
30
+
31
+ export { type AppleErrorResponse, type AppleOAuth2Token, type AppleUserInfo, apple };
@@ -0,0 +1,31 @@
1
+ import { Provider } from '../types.js';
2
+
3
+ declare function apple(): Provider<AppleUserInfo>;
4
+ interface AppleUserInfo {
5
+ sub: string;
6
+ email: string;
7
+ email_verified: true | 'true';
8
+ is_private_email: boolean;
9
+ real_user_status: number;
10
+ name: string;
11
+ picture: string;
12
+ user?: {
13
+ name: {
14
+ firstName: string;
15
+ lastName: string;
16
+ };
17
+ email: string;
18
+ };
19
+ }
20
+ interface AppleOAuth2Token {
21
+ access_token: string;
22
+ token_type: string;
23
+ expires_in: number;
24
+ refresh_token: string;
25
+ id_token: string;
26
+ }
27
+ interface AppleErrorResponse {
28
+ error: 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'unauthorized_client' | 'unsupported_grant_type' | 'invalid_scope';
29
+ }
30
+
31
+ export { type AppleErrorResponse, type AppleOAuth2Token, type AppleUserInfo, apple };
@@ -0,0 +1,50 @@
1
+ // src/oauth2/provider/apple.ts
2
+ import invariant from "tiny-invariant";
3
+ import { OAuth2Error } from "../error.mjs";
4
+ import { createAuthorizationUri, exchangeAuthorizationCode, verifyIdToken } from "./common.mjs";
5
+ function apple() {
6
+ return {
7
+ // important notice: response_mode=form_post is required for apple
8
+ authorizationUri: "https://appleid.apple.com/auth/authorize?response_mode=form_post",
9
+ tokenUri: "https://appleid.apple.com/auth/token",
10
+ jwkSetUri: "https://appleid.apple.com/auth/keys",
11
+ userNameAttribute: "sub",
12
+ defaultScope: ["openid", "name", "email"],
13
+ createAuthorizationUri({ codeVerifier, ...params }) {
14
+ return createAuthorizationUri({
15
+ ...params,
16
+ scope: params.scope ?? this.defaultScope,
17
+ authorizationUri: this.authorizationUri
18
+ });
19
+ },
20
+ async exchangeAuthorizationCode({ codeVerifier, ...params }) {
21
+ const response = await exchangeAuthorizationCode({ ...params, tokenUri: this.tokenUri });
22
+ if (!response.ok) {
23
+ const { error } = await response.json();
24
+ throw new OAuth2Error(response.status, error);
25
+ }
26
+ return await response.json();
27
+ },
28
+ async getUserInfo({ id_token }) {
29
+ invariant(id_token, "id_token is required");
30
+ invariant(this.jwkSetUri, "jwkSetUri is required");
31
+ const data = await verifyIdToken(id_token, this.jwkSetUri);
32
+ return {
33
+ data,
34
+ claims: {
35
+ sub: data.sub,
36
+ name: data.name,
37
+ email: data.email,
38
+ email_verified: true,
39
+ picture: data.picture,
40
+ given_name: data.user?.name.firstName,
41
+ family_name: data.user?.name.lastName
42
+ }
43
+ };
44
+ }
45
+ };
46
+ }
47
+ export {
48
+ apple
49
+ };
50
+ //# sourceMappingURL=apple.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/oauth2/provider/apple.ts"],"sourcesContent":["import invariant from 'tiny-invariant';\nimport { Provider } from '../types';\nimport { OAuth2Error } from '../error';\nimport { createAuthorizationUri, exchangeAuthorizationCode, verifyIdToken } from './common';\n\n// ref: https://account.apple.com/.well-known/openid-configuration\nexport function apple(): Provider<AppleUserInfo> {\n return {\n // important notice: response_mode=form_post is required for apple\n authorizationUri: 'https://appleid.apple.com/auth/authorize?response_mode=form_post',\n tokenUri: 'https://appleid.apple.com/auth/token',\n jwkSetUri: 'https://appleid.apple.com/auth/keys',\n userNameAttribute: 'sub',\n defaultScope: ['openid', 'name', 'email'],\n createAuthorizationUri({ codeVerifier, ...params }) {\n return createAuthorizationUri({\n ...params,\n scope: params.scope ?? this.defaultScope,\n authorizationUri: this.authorizationUri,\n });\n },\n async exchangeAuthorizationCode({ codeVerifier, ...params }) {\n const response = await exchangeAuthorizationCode({ ...params, tokenUri: this.tokenUri });\n if (!response.ok) {\n const { error } = (await response.json()) as AppleErrorResponse;\n throw new OAuth2Error(response.status, error);\n }\n return (await response.json()) as AppleOAuth2Token;\n },\n async getUserInfo({ id_token }) {\n invariant(id_token, 'id_token is required');\n invariant(this.jwkSetUri, 'jwkSetUri is required');\n const data = await verifyIdToken<AppleUserInfo>(id_token, this.jwkSetUri);\n return {\n data,\n claims: {\n sub: data.sub,\n name: data.name,\n email: data.email,\n email_verified: true,\n picture: data.picture,\n given_name: data.user?.name.firstName,\n family_name: data.user?.name.lastName,\n },\n };\n },\n };\n}\n\n// https://developer.apple.com/documentation/sign_in_with_apple/authenticating-users-with-sign-in-with-apple\nexport interface AppleUserInfo {\n sub: string;\n email: string;\n email_verified: true | 'true';\n is_private_email: boolean;\n real_user_status: number;\n name: string;\n picture: string;\n user?: {\n name: { firstName: string; lastName: string };\n email: string;\n };\n}\n\n// https://developer.apple.com/documentation/devicemanagement/implementing-the-oauth2-authentication-user-enrollment-flow\n// https://developer.apple.com/documentation/sign_in_with_apple/generate_and_validate_tokens\nexport interface AppleOAuth2Token {\n access_token: string;\n token_type: string;\n expires_in: number;\n refresh_token: string;\n id_token: string;\n}\n\n// https://developer.apple.com/documentation/sign_in_with_apple/errorresponse\nexport interface AppleErrorResponse {\n error:\n | 'invalid_request'\n | 'invalid_client'\n | 'invalid_grant'\n | 'unauthorized_client'\n | 'unsupported_grant_type'\n | 'invalid_scope';\n}\n"],"mappings":";AAAA,OAAO,eAAe;AAEtB,SAAS,mBAAmB;AAC5B,SAAS,wBAAwB,2BAA2B,qBAAqB;AAG1E,SAAS,QAAiC;AAC/C,SAAO;AAAA;AAAA,IAEL,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,cAAc,CAAC,UAAU,QAAQ,OAAO;AAAA,IACxC,uBAAuB,EAAE,cAAc,GAAG,OAAO,GAAG;AAClD,aAAO,uBAAuB;AAAA,QAC5B,GAAG;AAAA,QACH,OAAO,OAAO,SAAS,KAAK;AAAA,QAC5B,kBAAkB,KAAK;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,IACA,MAAM,0BAA0B,EAAE,cAAc,GAAG,OAAO,GAAG;AAC3D,YAAM,WAAW,MAAM,0BAA0B,EAAE,GAAG,QAAQ,UAAU,KAAK,SAAS,CAAC;AACvF,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,EAAE,MAAM,IAAK,MAAM,SAAS,KAAK;AACvC,cAAM,IAAI,YAAY,SAAS,QAAQ,KAAK;AAAA,MAC9C;AACA,aAAQ,MAAM,SAAS,KAAK;AAAA,IAC9B;AAAA,IACA,MAAM,YAAY,EAAE,SAAS,GAAG;AAC9B,gBAAU,UAAU,sBAAsB;AAC1C,gBAAU,KAAK,WAAW,uBAAuB;AACjD,YAAM,OAAO,MAAM,cAA6B,UAAU,KAAK,SAAS;AACxE,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,UACN,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,OAAO,KAAK;AAAA,UACZ,gBAAgB;AAAA,UAChB,SAAS,KAAK;AAAA,UACd,YAAY,KAAK,MAAM,KAAK;AAAA,UAC5B,aAAa,KAAK,MAAM,KAAK;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}