@authticon/client 0.0.0-beta8 → 0.0.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 (248) hide show
  1. package/README.md +390 -0
  2. package/dist/authticon.d.ts +122 -0
  3. package/dist/authticon.d.ts.map +1 -0
  4. package/dist/authticon.js +24 -0
  5. package/dist/authticon.js.map +1 -0
  6. package/dist/browser.d.ts +128 -0
  7. package/dist/browser.d.ts.map +1 -0
  8. package/dist/browser.js +14 -0
  9. package/dist/browser.js.map +1 -0
  10. package/dist/clients/admin.d.ts +107 -0
  11. package/dist/clients/admin.d.ts.map +1 -0
  12. package/dist/clients/admin.js +133 -0
  13. package/dist/clients/admin.js.map +1 -0
  14. package/dist/clients/auth.d.ts +34 -0
  15. package/dist/clients/auth.d.ts.map +1 -0
  16. package/dist/clients/auth.js +67 -0
  17. package/dist/clients/auth.js.map +1 -0
  18. package/dist/clients/base.d.ts +8 -0
  19. package/dist/clients/base.d.ts.map +1 -0
  20. package/dist/clients/base.js +18 -0
  21. package/dist/clients/base.js.map +1 -0
  22. package/dist/clients/generated/client/client.gen.d.ts.map +1 -0
  23. package/dist/clients/generated/client/client.gen.js +236 -0
  24. package/dist/clients/generated/client/client.gen.js.map +1 -0
  25. package/dist/{generated → clients/generated}/client/index.d.ts +2 -2
  26. package/dist/clients/generated/client/index.d.ts.map +1 -0
  27. package/dist/{generated → clients/generated}/client/index.js +1 -1
  28. package/dist/clients/generated/client/index.js.map +1 -0
  29. package/dist/clients/generated/client/types.gen.d.ts +118 -0
  30. package/dist/clients/generated/client/types.gen.d.ts.map +1 -0
  31. package/dist/clients/generated/client/types.gen.js.map +1 -0
  32. package/dist/clients/generated/client/utils.gen.d.ts +34 -0
  33. package/dist/clients/generated/client/utils.gen.d.ts.map +1 -0
  34. package/dist/{generated → clients/generated}/client/utils.gen.js +117 -57
  35. package/dist/clients/generated/client/utils.gen.js.map +1 -0
  36. package/dist/clients/generated/client.gen.d.ts.map +1 -0
  37. package/dist/{generated → clients/generated}/client.gen.js +1 -1
  38. package/dist/clients/generated/client.gen.js.map +1 -0
  39. package/dist/clients/generated/core/auth.gen.d.ts.map +1 -0
  40. package/dist/clients/generated/core/auth.gen.js.map +1 -0
  41. package/dist/clients/generated/core/bodySerializer.gen.d.ts.map +1 -0
  42. package/dist/clients/generated/core/bodySerializer.gen.js.map +1 -0
  43. package/dist/clients/generated/core/params.gen.d.ts.map +1 -0
  44. package/dist/clients/generated/core/params.gen.js.map +1 -0
  45. package/dist/clients/generated/core/pathSerializer.gen.d.ts.map +1 -0
  46. package/dist/clients/generated/core/pathSerializer.gen.js.map +1 -0
  47. package/dist/clients/generated/core/queryKeySerializer.gen.d.ts.map +1 -0
  48. package/dist/clients/generated/core/queryKeySerializer.gen.js.map +1 -0
  49. package/dist/clients/generated/core/serverSentEvents.gen.d.ts.map +1 -0
  50. package/dist/clients/generated/core/serverSentEvents.gen.js.map +1 -0
  51. package/dist/clients/generated/core/types.gen.d.ts.map +1 -0
  52. package/dist/clients/generated/core/types.gen.js.map +1 -0
  53. package/dist/clients/generated/core/utils.gen.d.ts.map +1 -0
  54. package/dist/clients/generated/core/utils.gen.js.map +1 -0
  55. package/dist/clients/generated/index.d.ts +3 -0
  56. package/dist/clients/generated/index.d.ts.map +1 -0
  57. package/dist/clients/generated/index.js +3 -0
  58. package/dist/clients/generated/index.js.map +1 -0
  59. package/dist/clients/generated/sdk.gen.d.ts +178 -0
  60. package/dist/clients/generated/sdk.gen.d.ts.map +1 -0
  61. package/dist/clients/generated/sdk.gen.js +445 -0
  62. package/dist/clients/generated/sdk.gen.js.map +1 -0
  63. package/dist/clients/generated/types.gen.d.ts +1355 -0
  64. package/dist/clients/generated/types.gen.d.ts.map +1 -0
  65. package/dist/clients/generated/types.gen.js.map +1 -0
  66. package/dist/clients/user.d.ts +70 -0
  67. package/dist/clients/user.d.ts.map +1 -0
  68. package/dist/clients/user.js +72 -0
  69. package/dist/clients/user.js.map +1 -0
  70. package/dist/cookies/browser.d.ts +3 -0
  71. package/dist/cookies/browser.d.ts.map +1 -0
  72. package/dist/cookies/browser.js +31 -0
  73. package/dist/cookies/browser.js.map +1 -0
  74. package/dist/cookies/node.d.ts +8 -0
  75. package/dist/cookies/node.d.ts.map +1 -0
  76. package/dist/cookies/node.js +49 -0
  77. package/dist/cookies/node.js.map +1 -0
  78. package/dist/errors.d.ts +22 -0
  79. package/dist/errors.d.ts.map +1 -0
  80. package/dist/errors.js +40 -0
  81. package/dist/errors.js.map +1 -0
  82. package/dist/node.d.ts +163 -0
  83. package/dist/node.d.ts.map +1 -0
  84. package/dist/node.js +46 -0
  85. package/dist/node.js.map +1 -0
  86. package/dist/password.d.ts +8 -0
  87. package/dist/password.d.ts.map +1 -0
  88. package/dist/password.js +23 -0
  89. package/dist/password.js.map +1 -0
  90. package/dist/session.d.ts +99 -0
  91. package/dist/session.d.ts.map +1 -0
  92. package/dist/session.js +223 -0
  93. package/dist/session.js.map +1 -0
  94. package/dist/tokens.d.ts +27 -0
  95. package/dist/tokens.d.ts.map +1 -0
  96. package/dist/tokens.js +212 -0
  97. package/dist/tokens.js.map +1 -0
  98. package/dist/types.d.ts +48 -6
  99. package/dist/types.d.ts.map +1 -1
  100. package/package.json +23 -8
  101. package/dist/Acccount.d.ts +0 -9
  102. package/dist/Acccount.d.ts.map +0 -1
  103. package/dist/Acccount.js +0 -22
  104. package/dist/Acccount.js.map +0 -1
  105. package/dist/Auth.d.ts +0 -25
  106. package/dist/Auth.d.ts.map +0 -1
  107. package/dist/Auth.js +0 -43
  108. package/dist/Auth.js.map +0 -1
  109. package/dist/Authticon.d.ts +0 -85
  110. package/dist/Authticon.d.ts.map +0 -1
  111. package/dist/Authticon.js +0 -62
  112. package/dist/Authticon.js.map +0 -1
  113. package/dist/BrowserCookieAdapter.d.ts +0 -13
  114. package/dist/BrowserCookieAdapter.d.ts.map +0 -1
  115. package/dist/BrowserCookieAdapter.js +0 -18
  116. package/dist/BrowserCookieAdapter.js.map +0 -1
  117. package/dist/BrowserCookieAdapter.test.d.ts +0 -2
  118. package/dist/BrowserCookieAdapter.test.d.ts.map +0 -1
  119. package/dist/BrowserCookieAdapter.test.js +0 -145
  120. package/dist/BrowserCookieAdapter.test.js.map +0 -1
  121. package/dist/Challange.d.ts +0 -8
  122. package/dist/Challange.d.ts.map +0 -1
  123. package/dist/Challange.js +0 -24
  124. package/dist/Challange.js.map +0 -1
  125. package/dist/CookieStorageAdapter.d.ts +0 -14
  126. package/dist/CookieStorageAdapter.d.ts.map +0 -1
  127. package/dist/CookieStorageAdapter.js +0 -42
  128. package/dist/CookieStorageAdapter.js.map +0 -1
  129. package/dist/CookieStorageAdapter.test.d.ts +0 -2
  130. package/dist/CookieStorageAdapter.test.d.ts.map +0 -1
  131. package/dist/CookieStorageAdapter.test.js +0 -130
  132. package/dist/CookieStorageAdapter.test.js.map +0 -1
  133. package/dist/RemixCookieAdapter.d.ts +0 -12
  134. package/dist/RemixCookieAdapter.d.ts.map +0 -1
  135. package/dist/RemixCookieAdapter.js +0 -25
  136. package/dist/RemixCookieAdapter.js.map +0 -1
  137. package/dist/RemixCookieAdapter.test.d.ts +0 -2
  138. package/dist/RemixCookieAdapter.test.d.ts.map +0 -1
  139. package/dist/RemixCookieAdapter.test.js +0 -136
  140. package/dist/RemixCookieAdapter.test.js.map +0 -1
  141. package/dist/TokenManager.d.ts +0 -22
  142. package/dist/TokenManager.d.ts.map +0 -1
  143. package/dist/TokenManager.js +0 -45
  144. package/dist/TokenManager.js.map +0 -1
  145. package/dist/TokenManager.test.d.ts +0 -2
  146. package/dist/TokenManager.test.d.ts.map +0 -1
  147. package/dist/TokenManager.test.js +0 -118
  148. package/dist/TokenManager.test.js.map +0 -1
  149. package/dist/TokenStorage.d.ts +0 -17
  150. package/dist/TokenStorage.d.ts.map +0 -1
  151. package/dist/TokenStorage.js +0 -68
  152. package/dist/TokenStorage.js.map +0 -1
  153. package/dist/TokenStorage.test.d.ts +0 -2
  154. package/dist/TokenStorage.test.d.ts.map +0 -1
  155. package/dist/TokenStorage.test.js +0 -179
  156. package/dist/TokenStorage.test.js.map +0 -1
  157. package/dist/TokenVerifier.d.ts +0 -13
  158. package/dist/TokenVerifier.d.ts.map +0 -1
  159. package/dist/TokenVerifier.js +0 -61
  160. package/dist/TokenVerifier.js.map +0 -1
  161. package/dist/TokenVerifier.test.d.ts +0 -2
  162. package/dist/TokenVerifier.test.d.ts.map +0 -1
  163. package/dist/TokenVerifier.test.js +0 -117
  164. package/dist/TokenVerifier.test.js.map +0 -1
  165. package/dist/TwoFa.d.ts +0 -26
  166. package/dist/TwoFa.d.ts.map +0 -1
  167. package/dist/TwoFa.js +0 -55
  168. package/dist/TwoFa.js.map +0 -1
  169. package/dist/User.d.ts +0 -25
  170. package/dist/User.d.ts.map +0 -1
  171. package/dist/User.js +0 -27
  172. package/dist/User.js.map +0 -1
  173. package/dist/Users.d.ts +0 -57
  174. package/dist/Users.d.ts.map +0 -1
  175. package/dist/Users.js +0 -55
  176. package/dist/Users.js.map +0 -1
  177. package/dist/cookie-utils.d.ts +0 -5
  178. package/dist/cookie-utils.d.ts.map +0 -1
  179. package/dist/cookie-utils.js +0 -33
  180. package/dist/cookie-utils.js.map +0 -1
  181. package/dist/generated/client/client.gen.d.ts.map +0 -1
  182. package/dist/generated/client/client.gen.js +0 -135
  183. package/dist/generated/client/client.gen.js.map +0 -1
  184. package/dist/generated/client/index.d.ts.map +0 -1
  185. package/dist/generated/client/index.js.map +0 -1
  186. package/dist/generated/client/types.gen.d.ts +0 -89
  187. package/dist/generated/client/types.gen.d.ts.map +0 -1
  188. package/dist/generated/client/types.gen.js.map +0 -1
  189. package/dist/generated/client/utils.gen.d.ts +0 -15
  190. package/dist/generated/client/utils.gen.d.ts.map +0 -1
  191. package/dist/generated/client/utils.gen.js.map +0 -1
  192. package/dist/generated/client.gen.d.ts.map +0 -1
  193. package/dist/generated/client.gen.js.map +0 -1
  194. package/dist/generated/core/auth.gen.d.ts.map +0 -1
  195. package/dist/generated/core/auth.gen.js.map +0 -1
  196. package/dist/generated/core/bodySerializer.gen.d.ts.map +0 -1
  197. package/dist/generated/core/bodySerializer.gen.js.map +0 -1
  198. package/dist/generated/core/params.gen.d.ts.map +0 -1
  199. package/dist/generated/core/params.gen.js.map +0 -1
  200. package/dist/generated/core/pathSerializer.gen.d.ts.map +0 -1
  201. package/dist/generated/core/pathSerializer.gen.js.map +0 -1
  202. package/dist/generated/core/queryKeySerializer.gen.d.ts.map +0 -1
  203. package/dist/generated/core/queryKeySerializer.gen.js.map +0 -1
  204. package/dist/generated/core/serverSentEvents.gen.d.ts.map +0 -1
  205. package/dist/generated/core/serverSentEvents.gen.js.map +0 -1
  206. package/dist/generated/core/types.gen.d.ts.map +0 -1
  207. package/dist/generated/core/types.gen.js.map +0 -1
  208. package/dist/generated/core/utils.gen.d.ts.map +0 -1
  209. package/dist/generated/core/utils.gen.js.map +0 -1
  210. package/dist/generated/index.d.ts +0 -3
  211. package/dist/generated/index.d.ts.map +0 -1
  212. package/dist/generated/index.js +0 -3
  213. package/dist/generated/index.js.map +0 -1
  214. package/dist/generated/sdk.gen.d.ts +0 -58
  215. package/dist/generated/sdk.gen.d.ts.map +0 -1
  216. package/dist/generated/sdk.gen.js +0 -337
  217. package/dist/generated/sdk.gen.js.map +0 -1
  218. package/dist/generated/types.gen.d.ts +0 -1344
  219. package/dist/generated/types.gen.d.ts.map +0 -1
  220. package/dist/generated/types.gen.js.map +0 -1
  221. package/dist/index.d.ts +0 -9
  222. package/dist/index.d.ts.map +0 -1
  223. package/dist/index.js +0 -8
  224. package/dist/index.js.map +0 -1
  225. package/dist/user.d.ts +0 -49
  226. package/dist/user.d.ts.map +0 -1
  227. package/dist/user.js +0 -35
  228. package/dist/user.js.map +0 -1
  229. /package/dist/{generated → clients/generated}/client/client.gen.d.ts +0 -0
  230. /package/dist/{generated → clients/generated}/client/types.gen.js +0 -0
  231. /package/dist/{generated → clients/generated}/client.gen.d.ts +0 -0
  232. /package/dist/{generated → clients/generated}/core/auth.gen.d.ts +0 -0
  233. /package/dist/{generated → clients/generated}/core/auth.gen.js +0 -0
  234. /package/dist/{generated → clients/generated}/core/bodySerializer.gen.d.ts +0 -0
  235. /package/dist/{generated → clients/generated}/core/bodySerializer.gen.js +0 -0
  236. /package/dist/{generated → clients/generated}/core/params.gen.d.ts +0 -0
  237. /package/dist/{generated → clients/generated}/core/params.gen.js +0 -0
  238. /package/dist/{generated → clients/generated}/core/pathSerializer.gen.d.ts +0 -0
  239. /package/dist/{generated → clients/generated}/core/pathSerializer.gen.js +0 -0
  240. /package/dist/{generated → clients/generated}/core/queryKeySerializer.gen.d.ts +0 -0
  241. /package/dist/{generated → clients/generated}/core/queryKeySerializer.gen.js +0 -0
  242. /package/dist/{generated → clients/generated}/core/serverSentEvents.gen.d.ts +0 -0
  243. /package/dist/{generated → clients/generated}/core/serverSentEvents.gen.js +0 -0
  244. /package/dist/{generated → clients/generated}/core/types.gen.d.ts +0 -0
  245. /package/dist/{generated → clients/generated}/core/types.gen.js +0 -0
  246. /package/dist/{generated → clients/generated}/core/utils.gen.d.ts +0 -0
  247. /package/dist/{generated → clients/generated}/core/utils.gen.js +0 -0
  248. /package/dist/{generated → clients/generated}/types.gen.js +0 -0
@@ -0,0 +1,8 @@
1
+ type PasswordOptions = {
2
+ baseUrl?: string;
3
+ };
4
+ export declare const createPassword: ({ baseUrl }: PasswordOptions) => {
5
+ encrypt: (password: string) => Promise<string>;
6
+ };
7
+ export {};
8
+ //# sourceMappingURL=password.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password.d.ts","sourceRoot":"","sources":["../src/password.ts"],"names":[],"mappings":"AAAA,KAAK,eAAe,GAAG;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,aAAa,eAAe;wBAuB7B,MAAM;CAWnC,CAAC"}
@@ -0,0 +1,23 @@
1
+ export const createPassword = ({ baseUrl }) => {
2
+ baseUrl = baseUrl ?? "https://authticon.com";
3
+ const importPublicKey = async () => {
4
+ const response = await fetch(`${baseUrl}/.well-known/encryption-key.pem`);
5
+ const pem = await response.text();
6
+ const pemContents = pem
7
+ .replace(/-----BEGIN PUBLIC KEY-----/, "")
8
+ .replace(/-----END PUBLIC KEY-----/, "")
9
+ .replace(/\s/g, "");
10
+ const binaryDer = Uint8Array.from(atob(pemContents), (c) => c.charCodeAt(0));
11
+ const publicKey = await window.crypto.subtle.importKey("spki", binaryDer.buffer, { name: "RSA-OAEP", hash: "SHA-256" }, false, ["encrypt"]);
12
+ return publicKey;
13
+ };
14
+ return {
15
+ encrypt: async (password) => {
16
+ const publicKey = await importPublicKey();
17
+ const encoded = new TextEncoder().encode(password);
18
+ const encrypted = await window.crypto.subtle.encrypt({ name: "RSA-OAEP" }, publicKey, encoded);
19
+ return btoa(String.fromCharCode(...new Uint8Array(encrypted)));
20
+ },
21
+ };
22
+ };
23
+ //# sourceMappingURL=password.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password.js","sourceRoot":"","sources":["../src/password.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAE,OAAO,EAAmB,EAAE,EAAE;IAC7D,OAAO,GAAG,OAAO,IAAI,uBAAuB,CAAC;IAC7C,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE;QACjC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,iCAAiC,CAAC,CAAC;QAC1E,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,GAAG;aACpB,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC;aACzC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC;aACvC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtB,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CACzD,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAChB,CAAC;QACF,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CACpD,MAAM,EACN,SAAS,CAAC,MAAM,EAChB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,EACrC,KAAK,EACL,CAAC,SAAS,CAAC,CACZ,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAE;YAClC,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACnD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAClD,EAAE,IAAI,EAAE,UAAU,EAAE,EACpB,SAAS,EACT,OAAO,CACR,CAAC;YACF,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,99 @@
1
+ import type { Logger } from "pino";
2
+ import type { AdminClient } from "./clients/admin.js";
3
+ import type { AcceptInvitationData, ChangeEmailData, ChangePasswordData, ChangePhoneData, CreateGuestUserData, CreateInvitationData, DeleteInvitationData, DisableTwoFaData, EnableTwoFaData, ForgotPasswordData, LoginByMagicLinkData, LoginData, RegisterData, ResendEmailConfirmationData, SendTwoFaCodeData, SetPasswordData, UpdateMeData, VerifyPhoneData } from "./clients/generated/types.gen.js";
4
+ import { type TokenVerifier } from "./tokens.js";
5
+ import type { AccessTokenPayload, Challenge, CookieAdapter, DefaultAccessTokenPayload, SessionUser, TokenStorageOptions } from "./types.js";
6
+ export type SessionClientDeps = {
7
+ readonly projectId: string;
8
+ readonly baseUrl: string;
9
+ readonly verifier: TokenVerifier<any>;
10
+ readonly logger?: Logger;
11
+ };
12
+ export type Session<Payload extends Record<string, any> = DefaultAccessTokenPayload> = Awaited<ReturnType<typeof createSession<Payload>>>;
13
+ export declare const createSession: <Payload extends Record<string, any> = Record<string, any>>(deps: SessionClientDeps, cookies: CookieAdapter, tokenStorageOptions?: TokenStorageOptions) => Promise<{
14
+ login: (params: LoginData["body"]) => Promise<SessionUser<Payload>>;
15
+ loginByMagicLink: (params: LoginByMagicLinkData["body"]) => Promise<SessionUser<Payload>>;
16
+ loginAs: (admin: AdminClient, targetUserId: string) => Promise<SessionUser<Payload> | null>;
17
+ backToAdmin: () => Promise<SessionUser<Payload> | null>;
18
+ register: (params: RegisterData["body"]) => Promise<{
19
+ userId: string;
20
+ }>;
21
+ forgotPassword: (params: ForgotPasswordData["body"]) => Promise<null>;
22
+ verifyEmail: (token: string) => Promise<void>;
23
+ createGuest: (params: CreateGuestUserData["body"]) => Promise<SessionUser<Payload>>;
24
+ acceptInvitation: (params: AcceptInvitationData["body"]) => Promise<SessionUser<Payload>>;
25
+ resendConfirmation: (params: ResendEmailConfirmationData["body"]) => Promise<null>;
26
+ getMe: () => Promise<{
27
+ id: string;
28
+ email: string;
29
+ firstName: string | null;
30
+ lastName: string | null;
31
+ isGuest: boolean;
32
+ claims: unknown;
33
+ phone: string | null;
34
+ locale: string;
35
+ passwordUpdatedAt: string | null;
36
+ hasPassword: boolean;
37
+ twoFaEnabled: boolean;
38
+ twoFaType: "APP" | "EMAIL" | "PHONE";
39
+ isBlocked: boolean;
40
+ isBlockedUntil: string | null;
41
+ phoneVerified: boolean;
42
+ emailVerified: boolean;
43
+ roles: Array<{
44
+ id: string;
45
+ role: string;
46
+ group: string;
47
+ }>;
48
+ metadata: {
49
+ [key: string]: unknown;
50
+ };
51
+ }>;
52
+ updateUser: (params: UpdateMeData["body"]) => Promise<{
53
+ id: string;
54
+ }>;
55
+ updateMe: (params: UpdateMeData["body"]) => Promise<{
56
+ id: string;
57
+ }>;
58
+ getUser: () => SessionUser<Payload> | null;
59
+ requireUser: () => SessionUser<Payload>;
60
+ getFirstChallenge: () => Challenge | undefined;
61
+ isLoggedIn: () => boolean;
62
+ isLoggedInByAdmin: () => boolean;
63
+ logout: () => Promise<void>;
64
+ refresh: () => Promise<void>;
65
+ getDeviceId: () => string | null;
66
+ changeEmail: (params: ChangeEmailData["body"]) => Promise<null>;
67
+ changePassword: (params: ChangePasswordData["body"]) => Promise<null>;
68
+ setPassword: (params: SetPasswordData["body"]) => Promise<null>;
69
+ changePhone: (params: ChangePhoneData["body"]) => Promise<null>;
70
+ verifyPhone: (params: VerifyPhoneData["body"]) => Promise<null>;
71
+ getTwoFaSecret: () => Promise<{
72
+ secret: string;
73
+ uri: string;
74
+ }>;
75
+ enableTwoFa: (params: EnableTwoFaData["body"]) => Promise<void>;
76
+ disableTwoFa: (params: DisableTwoFaData["body"]) => Promise<void>;
77
+ sendTwoFaCode: (params: SendTwoFaCodeData["body"]) => Promise<void>;
78
+ verifyTwoFaCode: (code: string, remember?: boolean) => Promise<SessionUser<Payload>>;
79
+ createInvitation: (params: CreateInvitationData["body"]) => Promise<{
80
+ id: string;
81
+ email: string;
82
+ token: string;
83
+ validTo: string;
84
+ role: string | null;
85
+ group: string | null;
86
+ returnUrl: string | null;
87
+ }>;
88
+ deleteInvitation: (params: DeleteInvitationData["path"]) => Promise<{
89
+ id: string;
90
+ }>;
91
+ tokens: {
92
+ getAccessToken: () => string | null;
93
+ getRefreshToken: () => string | null;
94
+ verify: (token?: string) => Promise<AccessTokenPayload<Payload>>;
95
+ clear: () => void;
96
+ };
97
+ cookies: CookieAdapter;
98
+ }>;
99
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EACV,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,SAAS,EACT,YAAY,EACZ,2BAA2B,EAC3B,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,KAAK,EACV,kBAAkB,EAClB,SAAS,EACT,aAAa,EACb,yBAAyB,EACzB,WAAW,EACX,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,OAAO,CACjB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,yBAAyB,IAC7D,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAEvD,eAAO,MAAM,aAAa,GACxB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAEzD,MAAM,iBAAiB,EACvB,SAAS,aAAa,EACtB,sBAAsB,mBAAmB;oBAuGvB,SAAS,CAAC,MAAM,CAAC;+BAYA,oBAAoB,CAAC,MAAM,CAAC;qBAYtC,WAAW,gBAAgB,MAAM;;uBAyB/B,YAAY,CAAC,MAAM,CAAC;;;6BAMpB,kBAAkB,CAAC,MAAM,CAAC;yBAG9B,MAAM;0BAEC,mBAAmB,CAAC,MAAM,CAAC;+BAQ5B,oBAAoB,CAAC,MAAM,CAAC;iCAM1B,2BAA2B,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAKrC,YAAY,CAAC,MAAM,CAAC;;;uBAGtB,YAAY,CAAC,MAAM,CAAC;;;mBAGhC,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI;uBAEvB,WAAW,CAAC,OAAO,CAAC;6BAKd,SAAS,GAAG,SAAS;;;;;;0BAgChB,eAAe,CAAC,MAAM,CAAC;6BAGpB,kBAAkB,CAAC,MAAM,CAAC;0BAG7B,eAAe,CAAC,MAAM,CAAC;0BAGvB,eAAe,CAAC,MAAM,CAAC;0BAGvB,eAAe,CAAC,MAAM,CAAC;;;;;0BASvB,eAAe,CAAC,MAAM,CAAC;2BAGtB,gBAAgB,CAAC,MAAM,CAAC;4BAGvB,iBAAiB,CAAC,MAAM,CAAC;4BAGzB,MAAM;+BAQH,oBAAoB,CAAC,MAAM,CAAC;;;;;;;;;+BAG5B,oBAAoB,CAAC,MAAM,CAAC;;;;;;yBAMpC,MAAM;;;;EAelC,CAAC"}
@@ -0,0 +1,223 @@
1
+ import { createAuthClient } from "./clients/auth.js";
2
+ import { createUserClient } from "./clients/user.js";
3
+ import { AuthticonError } from "./errors.js";
4
+ import { createTokenStorage } from "./tokens.js";
5
+ export const createSession = async (deps, cookies, tokenStorageOptions) => {
6
+ const storage = createTokenStorage(cookies, tokenStorageOptions, deps.logger?.child({ authticon: "token-storage" }));
7
+ const { projectId, baseUrl, verifier, logger } = deps;
8
+ const authApi = createAuthClient({ projectId, baseUrl, logger });
9
+ const toSessionUser = (raw) => {
10
+ const { authticon, ...payload } = raw;
11
+ return {
12
+ ...payload,
13
+ sessionId: authticon.sessionId,
14
+ projectId: authticon.projectId,
15
+ challenges: authticon.challenges,
16
+ raw,
17
+ };
18
+ };
19
+ let cachedUser = null;
20
+ const buildUserApi = () => {
21
+ const accessToken = storage.getAccessToken();
22
+ if (!accessToken)
23
+ throw new AuthticonError("No access token available");
24
+ return createUserClient({ accessToken, baseUrl, logger });
25
+ };
26
+ const saveTokens = (tokens) => {
27
+ storage.setAccessToken(tokens.accessToken);
28
+ storage.setRefreshToken(tokens.refreshToken);
29
+ if (tokens.deviceId)
30
+ storage.setDeviceId(tokens.deviceId);
31
+ };
32
+ const verifyAndBuildUser = async (token) => {
33
+ const accessToken = token ?? storage.getAccessToken();
34
+ if (!accessToken)
35
+ throw new AuthticonError("No access token found");
36
+ const payload = (await verifier.verifyToken(accessToken));
37
+ return toSessionUser(payload);
38
+ };
39
+ const tryRefresh = async () => {
40
+ const refreshToken = storage.getRefreshToken();
41
+ if (!refreshToken)
42
+ return null;
43
+ try {
44
+ const result = await buildUserApi().refresh(refreshToken);
45
+ if (!result)
46
+ return null;
47
+ storage.setAccessToken(result.accessToken);
48
+ storage.setRefreshToken(result.refreshToken);
49
+ return result.accessToken;
50
+ }
51
+ catch {
52
+ storage.clear();
53
+ return null;
54
+ }
55
+ };
56
+ const resolveUser = async () => {
57
+ const accessToken = storage.getAccessToken();
58
+ if (!accessToken)
59
+ return null;
60
+ try {
61
+ return await verifyAndBuildUser(accessToken);
62
+ }
63
+ catch {
64
+ const newToken = await tryRefresh();
65
+ return newToken ? verifyAndBuildUser(newToken) : null;
66
+ }
67
+ };
68
+ const authenticateWith = async (apiCall, errorMsg) => {
69
+ const result = await apiCall();
70
+ if (!result)
71
+ throw new AuthticonError(errorMsg);
72
+ saveTokens(result);
73
+ cachedUser = await verifyAndBuildUser(result.accessToken);
74
+ return cachedUser;
75
+ };
76
+ const refreshAfterCall = async (apiCall) => {
77
+ const result = await apiCall();
78
+ await tryRefresh();
79
+ cachedUser = await resolveUser();
80
+ if (!cachedUser)
81
+ throw new AuthticonError("User is not authenticated");
82
+ return result;
83
+ };
84
+ cachedUser = await resolveUser();
85
+ return {
86
+ login: (params) => {
87
+ const deviceId = storage.getDeviceId() || undefined;
88
+ return authenticateWith(() => authApi.login({
89
+ ...params,
90
+ deviceId,
91
+ }), "Login failed");
92
+ },
93
+ loginByMagicLink: async (params) => {
94
+ const deviceId = storage.getDeviceId() || undefined;
95
+ return authenticateWith(() => authApi.loginByMagicLink({
96
+ ...params,
97
+ deviceId,
98
+ }), "Login by magic link failed");
99
+ },
100
+ loginAs: async (admin, targetUserId) => {
101
+ if (!cachedUser)
102
+ throw new AuthticonError("User is not authenticated");
103
+ const deviceId = storage.getDeviceId() || undefined;
104
+ if (!deviceId)
105
+ throw new AuthticonError("Device ID is not set");
106
+ const result = await admin.loginAs({
107
+ userId: cachedUser.id,
108
+ deviceId,
109
+ targetUserId,
110
+ });
111
+ storage.setAdminRefreshToken(storage.getRefreshToken());
112
+ storage.setRefreshToken(result.refreshToken);
113
+ storage.setAccessToken(result.accessToken);
114
+ return resolveUser();
115
+ },
116
+ backToAdmin: async () => {
117
+ const adminRefreshToken = storage.getAdminRefreshToken();
118
+ if (!adminRefreshToken)
119
+ throw new AuthticonError("Admin refresh token is not set");
120
+ storage.clearAdminRefreshToken();
121
+ storage.setRefreshToken(adminRefreshToken);
122
+ await tryRefresh();
123
+ return resolveUser();
124
+ },
125
+ register: async (params) => {
126
+ const result = await authApi.register(params);
127
+ if (!result)
128
+ throw new AuthticonError("Register failed");
129
+ return result;
130
+ },
131
+ forgotPassword: (params) => authApi.forgotPassword(params),
132
+ verifyEmail: (token) => authApi.verifyEmail({ token }),
133
+ createGuest: async (params) => {
134
+ const result = await authApi.createGuestUser(params);
135
+ if (!result)
136
+ throw new AuthticonError("Guest creation failed");
137
+ storage.setAccessToken(result.token);
138
+ cachedUser = await verifyAndBuildUser(result.token);
139
+ return cachedUser;
140
+ },
141
+ acceptInvitation: (params) => authenticateWith(() => authApi.acceptInvitation(params), "Invitation acceptance failed"),
142
+ resendConfirmation: (params) => authApi.resendConfirmation(params),
143
+ getMe: async () => buildUserApi().getMe(),
144
+ updateUser: async (params) => buildUserApi().updateMe(params),
145
+ updateMe: async (params) => buildUserApi().updateMe(params),
146
+ getUser: () => cachedUser,
147
+ requireUser: () => {
148
+ if (!cachedUser)
149
+ throw new AuthticonError("User is not authenticated");
150
+ return cachedUser;
151
+ },
152
+ getFirstChallenge: () => {
153
+ if (!cachedUser)
154
+ throw new AuthticonError("User is not authenticated");
155
+ return cachedUser.challenges[0];
156
+ },
157
+ isLoggedIn: () => storage.getAccessToken() !== null,
158
+ isLoggedInByAdmin: () => storage.getAdminRefreshToken() !== null,
159
+ logout: async () => {
160
+ try {
161
+ if (storage.getAccessToken()) {
162
+ await buildUserApi().logout();
163
+ }
164
+ }
165
+ catch (error) {
166
+ logger?.warn({ error }, "Server logout failed");
167
+ }
168
+ finally {
169
+ storage.clearAccessToken();
170
+ storage.clearRefreshToken();
171
+ storage.clearAdminRefreshToken();
172
+ cachedUser = null;
173
+ }
174
+ },
175
+ refresh: async () => {
176
+ const newToken = await tryRefresh();
177
+ if (!newToken)
178
+ throw new AuthticonError("Token refresh failed");
179
+ cachedUser = await verifyAndBuildUser(newToken);
180
+ },
181
+ getDeviceId: () => storage.getDeviceId(),
182
+ changeEmail: async (params) => buildUserApi().changeEmail(params),
183
+ changePassword: async (params) => buildUserApi().changePassword(params),
184
+ setPassword: async (params) => buildUserApi().setPassword(params),
185
+ changePhone: async (params) => buildUserApi().changePhone(params),
186
+ verifyPhone: async (params) => buildUserApi().verifyPhone(params),
187
+ getTwoFaSecret: async () => {
188
+ const result = await buildUserApi().getTwoFaSecret();
189
+ if (!result)
190
+ throw new AuthticonError("Failed to get 2FA secret");
191
+ return result;
192
+ },
193
+ enableTwoFa: async (params) => refreshAfterCall(() => buildUserApi().enableTwoFa(params)),
194
+ disableTwoFa: async (params) => refreshAfterCall(() => buildUserApi().disableTwoFa(params)),
195
+ sendTwoFaCode: async (params) => buildUserApi().sendTwoFaCode(params),
196
+ verifyTwoFaCode: async (code, remember = false) => {
197
+ await buildUserApi().verifyTwoFa({ code, remember });
198
+ await tryRefresh();
199
+ cachedUser = await resolveUser();
200
+ if (!cachedUser)
201
+ throw new AuthticonError("User is not authenticated");
202
+ return cachedUser;
203
+ },
204
+ createInvitation: async (params) => buildUserApi().createInvitation(params),
205
+ deleteInvitation: async (params) => buildUserApi().deleteInvitation(params),
206
+ tokens: {
207
+ getAccessToken: () => storage.getAccessToken(),
208
+ getRefreshToken: () => storage.getRefreshToken(),
209
+ verify: async (token) => {
210
+ const accessToken = token ?? storage.getAccessToken();
211
+ if (!accessToken)
212
+ throw new AuthticonError("No access token found");
213
+ return verifier.verifyToken(accessToken);
214
+ },
215
+ clear: () => {
216
+ storage.clear();
217
+ cachedUser = null;
218
+ },
219
+ },
220
+ cookies,
221
+ };
222
+ };
223
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Logger } from "pino";
2
+ import type { AccessTokenPayload, CacheAdapter, CookieAdapter, TokenPair, TokenStorageOptions } from "./types.js";
3
+ export declare const createInMemoryCacheAdapter: () => CacheAdapter;
4
+ export type TokenStorage = {
5
+ readonly save: (tokens: TokenPair) => void;
6
+ readonly clear: () => void;
7
+ readonly getAccessToken: () => string | null;
8
+ readonly getRefreshToken: () => string | null;
9
+ readonly getDeviceId: () => string | null;
10
+ readonly getAdminRefreshToken: () => string | null;
11
+ readonly setAccessToken: (accessToken: string) => void;
12
+ readonly setRefreshToken: (refreshToken: string) => void;
13
+ readonly setAdminRefreshToken: (adminRefreshToken: string) => void;
14
+ readonly setDeviceId: (deviceId: string) => void;
15
+ readonly clearAccessToken: () => void;
16
+ readonly clearRefreshToken: () => void;
17
+ readonly clearDeviceId: () => void;
18
+ readonly clearAdminRefreshToken: () => void;
19
+ readonly getAll: () => TokenPair | null;
20
+ };
21
+ export declare const createTokenStorage: (cookies: CookieAdapter, options?: TokenStorageOptions, logger?: Logger) => TokenStorage;
22
+ export type TokenVerifier<Payload extends Record<string, any>> = {
23
+ readonly verifyToken: (token: string) => Promise<AccessTokenPayload<Payload>>;
24
+ readonly clearKeyCache: () => void;
25
+ };
26
+ export declare const createTokenVerifier: <Payload extends Record<string, any> = Record<string, any>>(jwksUrl: string, cacheTtlMs?: number, logger?: Logger, externalCache?: CacheAdapter) => TokenVerifier<Payload>;
27
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,KAAK,EACV,kBAAkB,EAClB,YAAY,EACZ,aAAa,EAGb,SAAS,EACT,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAIpB,eAAO,MAAM,0BAA0B,QAAO,YAY7C,CAAC;AAYF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,eAAe,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,oBAAoB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACnD,QAAQ,CAAC,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,QAAQ,CAAC,eAAe,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,QAAQ,CAAC,oBAAoB,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC;IACtC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,IAAI,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,IAAI,CAAC;IACnC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,IAAI,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,SAAS,GAAG,IAAI,CAAC;CACzC,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,SAAS,aAAa,EACtB,UAAS,mBAAwB,EACjC,SAAS,MAAM,KACd,YA0IF,CAAC;AAoCF,MAAM,MAAM,aAAa,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;IAC/D,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9E,QAAQ,CAAC,aAAa,EAAE,MAAM,IAAI,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAEzD,SAAS,MAAM,EACf,aAAY,MAA6B,EACzC,SAAS,MAAM,EACf,gBAAgB,YAAY,KAC3B,aAAa,CAAC,OAAO,CAiEvB,CAAC"}
package/dist/tokens.js ADDED
@@ -0,0 +1,212 @@
1
+ import * as jose from "jose";
2
+ import { decodeProtectedHeader, importJWK, jwtVerify, } from "jose";
3
+ import { AuthticonError, AuthticonTokenError } from "./errors.js";
4
+ // --- In-memory cache ---
5
+ export const createInMemoryCacheAdapter = () => {
6
+ const store = new Map();
7
+ return {
8
+ get: (key) => store.get(key),
9
+ set: (key, value) => {
10
+ store.set(key, value);
11
+ },
12
+ delete: (key) => {
13
+ store.delete(key);
14
+ },
15
+ };
16
+ };
17
+ // --- Token storage ---
18
+ const DEFAULT_ACCESS_TOKEN_NAME = "access_token";
19
+ const DEFAULT_REFRESH_TOKEN_NAME = "refresh_token";
20
+ const DEFAULT_DEVICE_ID_NAME = "device_id";
21
+ const DEFAULT_ADMIN_REFRESH_TOKEN_NAME = "admin_refresh_token";
22
+ const DEFAULT_ACCESS_TOKEN_MAX_AGE = 900;
23
+ const DEFAULT_REFRESH_TOKEN_MAX_AGE = 2_592_000;
24
+ const DEFAULT_ADMIN_REFRESH_TOKEN_MAX_AGE = 2_592_000;
25
+ export const createTokenStorage = (cookies, options = {}, logger) => {
26
+ const accessName = options.accessTokenName ?? DEFAULT_ACCESS_TOKEN_NAME;
27
+ const refreshName = options.refreshTokenName ?? DEFAULT_REFRESH_TOKEN_NAME;
28
+ const deviceIdName = options.deviceIdName ?? DEFAULT_DEVICE_ID_NAME;
29
+ const adminRefreshName = options.adminRefreshTokenName ?? DEFAULT_ADMIN_REFRESH_TOKEN_NAME;
30
+ const path = options.path ?? "/";
31
+ const domain = options.domain;
32
+ const secure = options.secure ?? true;
33
+ const sameSite = options.sameSite ?? "lax";
34
+ const setOpts = {
35
+ access: {
36
+ path,
37
+ domain,
38
+ secure,
39
+ sameSite,
40
+ maxAge: options.accessTokenMaxAge ?? DEFAULT_ACCESS_TOKEN_MAX_AGE,
41
+ },
42
+ refresh: {
43
+ path,
44
+ domain,
45
+ secure,
46
+ sameSite,
47
+ maxAge: options.refreshTokenMaxAge ?? DEFAULT_REFRESH_TOKEN_MAX_AGE,
48
+ },
49
+ deviceId: {
50
+ path,
51
+ domain,
52
+ secure,
53
+ sameSite,
54
+ maxAge: options.refreshTokenMaxAge ?? DEFAULT_REFRESH_TOKEN_MAX_AGE,
55
+ },
56
+ adminRefresh: {
57
+ path,
58
+ domain,
59
+ secure,
60
+ sameSite,
61
+ maxAge: options.adminRefreshTokenMaxAge ?? DEFAULT_ADMIN_REFRESH_TOKEN_MAX_AGE,
62
+ },
63
+ };
64
+ const removeOpts = { path, domain };
65
+ const setAccessToken = (accessToken) => {
66
+ logger?.debug({ accessToken: accessToken.slice(0, 10) + "..." }, "Setting access token");
67
+ cookies.set(accessName, accessToken, setOpts.access);
68
+ };
69
+ const setRefreshToken = (refreshToken) => {
70
+ logger?.debug({ refreshToken: refreshToken.slice(0, 10) + "..." }, "Setting refresh token");
71
+ cookies.set(refreshName, refreshToken, setOpts.refresh);
72
+ };
73
+ const setAdminRefreshToken = (adminRefreshToken) => {
74
+ logger?.debug({ adminRefreshToken: adminRefreshToken.slice(0, 10) + "..." }, "Setting admin refresh token");
75
+ cookies.set(adminRefreshName, adminRefreshToken, setOpts.adminRefresh);
76
+ };
77
+ const setDeviceId = (deviceId) => {
78
+ logger?.debug({ deviceId }, "Setting device id");
79
+ cookies.set(deviceIdName, deviceId, setOpts.deviceId);
80
+ };
81
+ const clearAccessToken = () => {
82
+ logger?.debug("Clearing access token");
83
+ cookies.remove(accessName, removeOpts);
84
+ };
85
+ const clearRefreshToken = () => {
86
+ logger?.debug("Clearing refresh token");
87
+ cookies.remove(refreshName, removeOpts);
88
+ };
89
+ const clearDeviceId = () => {
90
+ logger?.debug("Clearing device id");
91
+ cookies.remove(deviceIdName, removeOpts);
92
+ };
93
+ const clearAdminRefreshToken = () => {
94
+ logger?.debug("Clearing admin refresh token");
95
+ cookies.remove(adminRefreshName, removeOpts);
96
+ };
97
+ const getAccessToken = () => cookies.get(accessName);
98
+ const getRefreshToken = () => cookies.get(refreshName);
99
+ const getDeviceId = () => cookies.get(deviceIdName);
100
+ const getAdminRefreshToken = () => cookies.get(adminRefreshName);
101
+ return {
102
+ save: (tokens) => {
103
+ setAccessToken(tokens.accessToken);
104
+ setRefreshToken(tokens.refreshToken);
105
+ if (tokens.deviceId)
106
+ setDeviceId(tokens.deviceId);
107
+ if (tokens.adminRefreshToken)
108
+ setAdminRefreshToken(tokens.adminRefreshToken);
109
+ },
110
+ clear: () => {
111
+ clearAccessToken();
112
+ clearRefreshToken();
113
+ clearDeviceId();
114
+ clearAdminRefreshToken();
115
+ },
116
+ getAccessToken,
117
+ getRefreshToken,
118
+ getDeviceId,
119
+ getAdminRefreshToken,
120
+ setAccessToken,
121
+ setRefreshToken,
122
+ setAdminRefreshToken,
123
+ setDeviceId,
124
+ clearAccessToken,
125
+ clearRefreshToken,
126
+ clearDeviceId,
127
+ clearAdminRefreshToken,
128
+ getAll: () => {
129
+ const accessToken = getAccessToken();
130
+ const refreshToken = getRefreshToken();
131
+ if (!accessToken || !refreshToken)
132
+ return null;
133
+ return {
134
+ accessToken,
135
+ refreshToken,
136
+ deviceId: getDeviceId() ?? undefined,
137
+ adminRefreshToken: getAdminRefreshToken() ?? undefined,
138
+ };
139
+ },
140
+ };
141
+ };
142
+ const DEFAULT_CACHE_TTL_MS = 3_600_000;
143
+ const JWKS_CACHE_KEY = "authticon:jwks";
144
+ const importKeysFromJwks = async (jwks) => {
145
+ const keysWithKid = jwks.filter((jwk) => typeof jwk.kid === "string");
146
+ const entries = await Promise.all(keysWithKid.map(async (jwk) => {
147
+ const imported = await importJWK(jwk);
148
+ if (imported instanceof Uint8Array) {
149
+ throw new Error(`Symmetric key (kid: ${jwk.kid}) is not supported`);
150
+ }
151
+ return [jwk.kid, imported];
152
+ }));
153
+ return new Map(entries);
154
+ };
155
+ export const createTokenVerifier = (jwksUrl, cacheTtlMs = DEFAULT_CACHE_TTL_MS, logger, externalCache) => {
156
+ const cache = externalCache ?? createInMemoryCacheAdapter();
157
+ const fetchJwks = async () => {
158
+ const response = await fetch(jwksUrl);
159
+ if (!response.ok) {
160
+ throw new AuthticonError(`Failed to fetch JWKS: ${response.status}`);
161
+ }
162
+ const data = await response.json();
163
+ const keys = await importKeysFromJwks(data.keys);
164
+ cache.set(JWKS_CACHE_KEY, { keys, fetchedAt: Date.now() });
165
+ logger?.debug({ jwksUrl }, "JWKS fetched");
166
+ return keys;
167
+ };
168
+ const getCachedOrFetch = async () => {
169
+ const cached = cache.get(JWKS_CACHE_KEY);
170
+ if (cached && Date.now() - cached.fetchedAt < cacheTtlMs) {
171
+ return cached.keys;
172
+ }
173
+ return fetchJwks();
174
+ };
175
+ const resolveKey = async (kid) => {
176
+ const keys = await getCachedOrFetch();
177
+ const key = keys.get(kid);
178
+ if (key)
179
+ return key;
180
+ cache.delete(JWKS_CACHE_KEY);
181
+ const freshKeys = await fetchJwks();
182
+ const freshKey = freshKeys.get(kid);
183
+ if (!freshKey) {
184
+ throw new AuthticonError(`Key with kid "${kid}" not found in JWKS`);
185
+ }
186
+ return freshKey;
187
+ };
188
+ return {
189
+ verifyToken: async (token) => {
190
+ try {
191
+ const header = decodeProtectedHeader(token);
192
+ if (!header.kid) {
193
+ throw new AuthticonError("Token header is missing 'kid' claim");
194
+ }
195
+ const key = await resolveKey(header.kid);
196
+ const { payload } = await jwtVerify(token, key);
197
+ return payload;
198
+ }
199
+ catch (error) {
200
+ if (error instanceof jose.errors.JOSEError) {
201
+ throw new AuthticonTokenError(error.message, error.code, error);
202
+ }
203
+ throw error;
204
+ }
205
+ },
206
+ clearKeyCache: () => {
207
+ cache.delete(JWKS_CACHE_KEY);
208
+ logger?.debug("Key cache cleared");
209
+ },
210
+ };
211
+ };
212
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}