@authticon/client 0.0.0-beta4 → 0.0.0-beta41

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 +375 -0
  2. package/dist/CookieStorageAdapter.d.ts +15 -0
  3. package/dist/CookieStorageAdapter.d.ts.map +1 -0
  4. package/dist/CookieStorageAdapter.js +60 -0
  5. package/dist/CookieStorageAdapter.js.map +1 -0
  6. package/dist/InMemoryCacheAdapter.d.ts +3 -0
  7. package/dist/InMemoryCacheAdapter.d.ts.map +1 -0
  8. package/dist/InMemoryCacheAdapter.js +13 -0
  9. package/dist/InMemoryCacheAdapter.js.map +1 -0
  10. package/dist/TokenStorage.d.ts +14 -10
  11. package/dist/TokenStorage.d.ts.map +1 -1
  12. package/dist/TokenStorage.js +92 -59
  13. package/dist/TokenStorage.js.map +1 -1
  14. package/dist/TokenVerifier.d.ts +6 -11
  15. package/dist/TokenVerifier.d.ts.map +1 -1
  16. package/dist/TokenVerifier.js +48 -34
  17. package/dist/TokenVerifier.js.map +1 -1
  18. package/dist/admin.d.ts +2 -0
  19. package/dist/admin.d.ts.map +1 -0
  20. package/dist/admin.js +2 -0
  21. package/dist/admin.js.map +1 -0
  22. package/dist/adminClient.d.ts +104 -0
  23. package/dist/adminClient.d.ts.map +1 -0
  24. package/dist/adminClient.js +108 -0
  25. package/dist/adminClient.js.map +1 -0
  26. package/dist/apiClient.d.ts +8 -0
  27. package/dist/apiClient.d.ts.map +1 -0
  28. package/dist/apiClient.js +18 -0
  29. package/dist/apiClient.js.map +1 -0
  30. package/dist/authClient.d.ts +42 -0
  31. package/dist/authClient.d.ts.map +1 -0
  32. package/dist/authClient.js +75 -0
  33. package/dist/authClient.js.map +1 -0
  34. package/dist/authticon.d.ts +131 -0
  35. package/dist/authticon.d.ts.map +1 -0
  36. package/dist/authticon.js +24 -0
  37. package/dist/authticon.js.map +1 -0
  38. package/dist/browser.d.ts +134 -0
  39. package/dist/browser.d.ts.map +1 -0
  40. package/dist/browser.js +7 -0
  41. package/dist/browser.js.map +1 -0
  42. package/dist/clients/admin.d.ts +106 -0
  43. package/dist/clients/admin.d.ts.map +1 -0
  44. package/dist/clients/admin.js +126 -0
  45. package/dist/clients/admin.js.map +1 -0
  46. package/dist/clients/auth.d.ts +42 -0
  47. package/dist/clients/auth.d.ts.map +1 -0
  48. package/dist/clients/auth.js +74 -0
  49. package/dist/clients/auth.js.map +1 -0
  50. package/dist/clients/base.d.ts +8 -0
  51. package/dist/clients/base.d.ts.map +1 -0
  52. package/dist/clients/base.js +18 -0
  53. package/dist/clients/base.js.map +1 -0
  54. package/dist/clients/generated/client/client.gen.d.ts +3 -0
  55. package/dist/clients/generated/client/client.gen.d.ts.map +1 -0
  56. package/dist/clients/generated/client/client.gen.js +236 -0
  57. package/dist/clients/generated/client/client.gen.js.map +1 -0
  58. package/dist/clients/generated/client/index.d.ts +9 -0
  59. package/dist/clients/generated/client/index.d.ts.map +1 -0
  60. package/dist/clients/generated/client/index.js +7 -0
  61. package/dist/clients/generated/client/index.js.map +1 -0
  62. package/dist/clients/generated/client/types.gen.d.ts +118 -0
  63. package/dist/clients/generated/client/types.gen.d.ts.map +1 -0
  64. package/dist/clients/generated/client/types.gen.js +3 -0
  65. package/dist/clients/generated/client/types.gen.js.map +1 -0
  66. package/dist/clients/generated/client/utils.gen.d.ts +34 -0
  67. package/dist/clients/generated/client/utils.gen.d.ts.map +1 -0
  68. package/dist/clients/generated/client/utils.gen.js +229 -0
  69. package/dist/clients/generated/client/utils.gen.js.map +1 -0
  70. package/dist/clients/generated/client.gen.d.ts +13 -0
  71. package/dist/clients/generated/client.gen.d.ts.map +1 -0
  72. package/dist/clients/generated/client.gen.js +4 -0
  73. package/dist/clients/generated/client.gen.js.map +1 -0
  74. package/dist/clients/generated/core/auth.gen.d.ts +19 -0
  75. package/dist/clients/generated/core/auth.gen.d.ts.map +1 -0
  76. package/dist/clients/generated/core/auth.gen.js +15 -0
  77. package/dist/clients/generated/core/auth.gen.js.map +1 -0
  78. package/dist/clients/generated/core/bodySerializer.gen.d.ts +26 -0
  79. package/dist/clients/generated/core/bodySerializer.gen.d.ts.map +1 -0
  80. package/dist/clients/generated/core/bodySerializer.gen.js +58 -0
  81. package/dist/clients/generated/core/bodySerializer.gen.js.map +1 -0
  82. package/dist/clients/generated/core/params.gen.d.ts +44 -0
  83. package/dist/clients/generated/core/params.gen.d.ts.map +1 -0
  84. package/dist/clients/generated/core/params.gen.js +101 -0
  85. package/dist/clients/generated/core/params.gen.js.map +1 -0
  86. package/dist/clients/generated/core/pathSerializer.gen.d.ts +34 -0
  87. package/dist/clients/generated/core/pathSerializer.gen.d.ts.map +1 -0
  88. package/dist/clients/generated/core/pathSerializer.gen.js +107 -0
  89. package/dist/clients/generated/core/pathSerializer.gen.js.map +1 -0
  90. package/dist/clients/generated/core/queryKeySerializer.gen.d.ts +19 -0
  91. package/dist/clients/generated/core/queryKeySerializer.gen.d.ts.map +1 -0
  92. package/dist/clients/generated/core/queryKeySerializer.gen.js +93 -0
  93. package/dist/clients/generated/core/queryKeySerializer.gen.js.map +1 -0
  94. package/dist/clients/generated/core/serverSentEvents.gen.d.ts +72 -0
  95. package/dist/clients/generated/core/serverSentEvents.gen.d.ts.map +1 -0
  96. package/dist/clients/generated/core/serverSentEvents.gen.js +134 -0
  97. package/dist/clients/generated/core/serverSentEvents.gen.js.map +1 -0
  98. package/dist/clients/generated/core/types.gen.d.ts +79 -0
  99. package/dist/clients/generated/core/types.gen.d.ts.map +1 -0
  100. package/dist/clients/generated/core/types.gen.js +3 -0
  101. package/dist/clients/generated/core/types.gen.js.map +1 -0
  102. package/dist/clients/generated/core/utils.gen.d.ts +20 -0
  103. package/dist/clients/generated/core/utils.gen.d.ts.map +1 -0
  104. package/dist/clients/generated/core/utils.gen.js +88 -0
  105. package/dist/clients/generated/core/utils.gen.js.map +1 -0
  106. package/dist/clients/generated/index.d.ts +3 -0
  107. package/dist/clients/generated/index.d.ts.map +1 -0
  108. package/dist/clients/generated/index.js +3 -0
  109. package/dist/clients/generated/index.js.map +1 -0
  110. package/dist/clients/generated/sdk.gen.d.ts +168 -0
  111. package/dist/clients/generated/sdk.gen.d.ts.map +1 -0
  112. package/dist/clients/generated/sdk.gen.js +427 -0
  113. package/dist/clients/generated/sdk.gen.js.map +1 -0
  114. package/dist/clients/generated/types.gen.d.ts +1261 -0
  115. package/dist/clients/generated/types.gen.d.ts.map +1 -0
  116. package/dist/clients/generated/types.gen.js +3 -0
  117. package/dist/clients/generated/types.gen.js.map +1 -0
  118. package/dist/clients/user.d.ts +67 -0
  119. package/dist/clients/user.d.ts.map +1 -0
  120. package/dist/clients/user.js +72 -0
  121. package/dist/clients/user.js.map +1 -0
  122. package/dist/cookies/browser.d.ts +3 -0
  123. package/dist/cookies/browser.d.ts.map +1 -0
  124. package/dist/cookies/browser.js +31 -0
  125. package/dist/cookies/browser.js.map +1 -0
  126. package/dist/cookies/node.d.ts +8 -0
  127. package/dist/cookies/node.d.ts.map +1 -0
  128. package/dist/cookies/node.js +49 -0
  129. package/dist/cookies/node.js.map +1 -0
  130. package/dist/createSessionUser.d.ts +3 -0
  131. package/dist/createSessionUser.d.ts.map +1 -0
  132. package/dist/createSessionUser.js +15 -0
  133. package/dist/createSessionUser.js.map +1 -0
  134. package/dist/errors.d.ts +22 -0
  135. package/dist/errors.d.ts.map +1 -0
  136. package/dist/errors.js +40 -0
  137. package/dist/errors.js.map +1 -0
  138. package/dist/generated/client/client.gen.d.ts.map +1 -1
  139. package/dist/generated/client/client.gen.js +151 -50
  140. package/dist/generated/client/client.gen.js.map +1 -1
  141. package/dist/generated/client/index.d.ts +2 -2
  142. package/dist/generated/client/index.d.ts.map +1 -1
  143. package/dist/generated/client/index.js +1 -1
  144. package/dist/generated/client/index.js.map +1 -1
  145. package/dist/generated/client/types.gen.d.ts +53 -24
  146. package/dist/generated/client/types.gen.d.ts.map +1 -1
  147. package/dist/generated/client/utils.gen.d.ts +25 -6
  148. package/dist/generated/client/utils.gen.d.ts.map +1 -1
  149. package/dist/generated/client/utils.gen.js +117 -57
  150. package/dist/generated/client/utils.gen.js.map +1 -1
  151. package/dist/generated/client.gen.js +1 -1
  152. package/dist/generated/index.d.ts +2 -2
  153. package/dist/generated/index.d.ts.map +1 -1
  154. package/dist/generated/index.js +1 -1
  155. package/dist/generated/index.js.map +1 -1
  156. package/dist/generated/sdk.gen.d.ts +153 -52
  157. package/dist/generated/sdk.gen.d.ts.map +1 -1
  158. package/dist/generated/sdk.gen.js +234 -209
  159. package/dist/generated/sdk.gen.js.map +1 -1
  160. package/dist/generated/types.gen.d.ts +557 -971
  161. package/dist/generated/types.gen.d.ts.map +1 -1
  162. package/dist/index.d.ts +2 -6
  163. package/dist/index.d.ts.map +1 -1
  164. package/dist/index.js +2 -6
  165. package/dist/index.js.map +1 -1
  166. package/dist/node.d.ts +171 -0
  167. package/dist/node.d.ts.map +1 -0
  168. package/dist/node.js +46 -0
  169. package/dist/node.js.map +1 -0
  170. package/dist/session.d.ts +100 -0
  171. package/dist/session.d.ts.map +1 -0
  172. package/dist/session.js +203 -0
  173. package/dist/session.js.map +1 -0
  174. package/dist/sessionClient.d.ts +53 -0
  175. package/dist/sessionClient.d.ts.map +1 -0
  176. package/dist/sessionClient.js +267 -0
  177. package/dist/sessionClient.js.map +1 -0
  178. package/dist/tokens.d.ts +27 -0
  179. package/dist/tokens.d.ts.map +1 -0
  180. package/dist/tokens.js +212 -0
  181. package/dist/tokens.js.map +1 -0
  182. package/dist/types.d.ts +47 -8
  183. package/dist/types.d.ts.map +1 -1
  184. package/dist/userClient.d.ts +41 -0
  185. package/dist/userClient.d.ts.map +1 -0
  186. package/dist/userClient.js +64 -0
  187. package/dist/userClient.js.map +1 -0
  188. package/package.json +24 -7
  189. package/dist/Acccount.d.ts +0 -9
  190. package/dist/Acccount.d.ts.map +0 -1
  191. package/dist/Acccount.js +0 -22
  192. package/dist/Acccount.js.map +0 -1
  193. package/dist/Auth.d.ts +0 -19
  194. package/dist/Auth.d.ts.map +0 -1
  195. package/dist/Auth.js +0 -24
  196. package/dist/Auth.js.map +0 -1
  197. package/dist/Authticon.d.ts +0 -27
  198. package/dist/Authticon.d.ts.map +0 -1
  199. package/dist/Authticon.js +0 -41
  200. package/dist/Authticon.js.map +0 -1
  201. package/dist/BrowserCookieAdapter.d.ts +0 -13
  202. package/dist/BrowserCookieAdapter.d.ts.map +0 -1
  203. package/dist/BrowserCookieAdapter.js +0 -18
  204. package/dist/BrowserCookieAdapter.js.map +0 -1
  205. package/dist/BrowserCookieAdapter.test.d.ts +0 -2
  206. package/dist/BrowserCookieAdapter.test.d.ts.map +0 -1
  207. package/dist/BrowserCookieAdapter.test.js +0 -145
  208. package/dist/BrowserCookieAdapter.test.js.map +0 -1
  209. package/dist/RemixCookieAdapter.d.ts +0 -12
  210. package/dist/RemixCookieAdapter.d.ts.map +0 -1
  211. package/dist/RemixCookieAdapter.js +0 -25
  212. package/dist/RemixCookieAdapter.js.map +0 -1
  213. package/dist/RemixCookieAdapter.test.d.ts +0 -2
  214. package/dist/RemixCookieAdapter.test.d.ts.map +0 -1
  215. package/dist/RemixCookieAdapter.test.js +0 -136
  216. package/dist/RemixCookieAdapter.test.js.map +0 -1
  217. package/dist/TokenManager.d.ts +0 -22
  218. package/dist/TokenManager.d.ts.map +0 -1
  219. package/dist/TokenManager.js +0 -45
  220. package/dist/TokenManager.js.map +0 -1
  221. package/dist/TokenManager.test.d.ts +0 -2
  222. package/dist/TokenManager.test.d.ts.map +0 -1
  223. package/dist/TokenManager.test.js +0 -118
  224. package/dist/TokenManager.test.js.map +0 -1
  225. package/dist/TokenStorage.test.d.ts +0 -2
  226. package/dist/TokenStorage.test.d.ts.map +0 -1
  227. package/dist/TokenStorage.test.js +0 -179
  228. package/dist/TokenStorage.test.js.map +0 -1
  229. package/dist/TokenVerifier.test.d.ts +0 -2
  230. package/dist/TokenVerifier.test.d.ts.map +0 -1
  231. package/dist/TokenVerifier.test.js +0 -117
  232. package/dist/TokenVerifier.test.js.map +0 -1
  233. package/dist/TwoFa.d.ts +0 -22
  234. package/dist/TwoFa.d.ts.map +0 -1
  235. package/dist/TwoFa.js +0 -47
  236. package/dist/TwoFa.js.map +0 -1
  237. package/dist/User.d.ts +0 -25
  238. package/dist/User.d.ts.map +0 -1
  239. package/dist/User.js +0 -27
  240. package/dist/User.js.map +0 -1
  241. package/dist/Users.d.ts +0 -57
  242. package/dist/Users.d.ts.map +0 -1
  243. package/dist/Users.js +0 -54
  244. package/dist/Users.js.map +0 -1
  245. package/dist/cookie-utils.d.ts +0 -5
  246. package/dist/cookie-utils.d.ts.map +0 -1
  247. package/dist/cookie-utils.js +0 -33
  248. package/dist/cookie-utils.js.map +0 -1
package/README.md ADDED
@@ -0,0 +1,375 @@
1
+ # @authticon/client
2
+
3
+ Oficjalny klient JavaScript/TypeScript dla [Authticon](https://authticon.com) — usługi uwierzytelniania. Biblioteka wspiera zarówno środowisko **Node.js** (SSR, API routes), jak i **przeglądarkę** (SPA, client-side).
4
+
5
+ ## Instalacja
6
+
7
+ ```bash
8
+ npm install @authticon/client
9
+ ```
10
+
11
+ **Wymagania:** Node.js >= 18
12
+
13
+ ## Dwa entry pointy
14
+
15
+ Biblioteka dostarcza dwa osobne moduły z odrębnymi implementacjami cookie i sesji:
16
+
17
+ | Import | Środowisko | Cookie adapter |
18
+ |---|---|---|
19
+ | `@authticon/client` lub `@authticon/client/node` | Node.js / SSR | Parsuje cookies z obiektu `Request`, zwraca `CookieStorageAdapter` z metodami `applyToResponse()`, `stringifySetCookies()` |
20
+ | `@authticon/client/browser` | Przeglądarka / SPA | Używa `document.cookie` |
21
+
22
+ ## Szybki start
23
+
24
+ ### Node.js (np. Next.js, Express, Hono)
25
+
26
+ ```typescript
27
+ import { createAuthticon } from "@authticon/client/node";
28
+
29
+ const authticon = createAuthticon({
30
+ projectId: "your-project-id",
31
+ });
32
+
33
+ // W handlerze HTTP:
34
+ async function handler(request: Request) {
35
+ const { getUser, login, logout, cookies } = await authticon.session({
36
+ request,
37
+ });
38
+
39
+ const user = getUser(); // SessionUser | null
40
+
41
+ // cookies.applyToResponse(response) — ustawia Set-Cookie na odpowiedzi
42
+ }
43
+ ```
44
+
45
+ ### Przeglądarka
46
+
47
+ ```typescript
48
+ import { createAuthticon } from "@authticon/client/browser";
49
+
50
+ const authticon = createAuthticon({
51
+ projectId: "your-project-id",
52
+ });
53
+
54
+ const session = await authticon.session({});
55
+
56
+ const user = session.getUser();
57
+ await session.login({ email: "user@example.com", password: "secret" });
58
+ ```
59
+
60
+ ## Konfiguracja
61
+
62
+ ```typescript
63
+ type AuthticonOptions = {
64
+ projectId: string; // ID projektu w Authticon (wymagane)
65
+ baseUrl?: string; // URL API (domyślnie: "https://authticon.com")
66
+ jwksUrl?: string; // URL do JWKS (domyślnie: {baseUrl}/.well-known/jwks.json)
67
+ jwksCacheTtlMs?: number; // TTL cache kluczy JWKS (domyślnie: 1h)
68
+ cache?: CacheAdapter; // Zewnętrzny adapter cache (domyślnie: in-memory)
69
+ logger?: Logger; // Instancja pino logger
70
+ };
71
+ ```
72
+
73
+ ## Session (API stanowe)
74
+
75
+ `session()` to główny sposób interakcji z biblioteką. Tworzy **stanowy obiekt sesji**, który:
76
+
77
+ 1. Przy tworzeniu automatycznie odczytuje tokeny z cookies
78
+ 2. Weryfikuje access token za pomocą JWKS
79
+ 3. Jeśli token wygasł — automatycznie odświeża go za pomocą refresh tokena
80
+ 4. Cache'uje obiekt `SessionUser` w pamięci na czas życia sesji
81
+ 5. Operacje takie jak `login()`, `logout()`, `createGuest()` automatycznie aktualizują wewnętrzny stan sesji i zapisują nowe tokeny w cookies
82
+
83
+ ### Tworzenie sesji
84
+
85
+ #### Node.js — z obiektu `Request`
86
+
87
+ ```typescript
88
+ const session = await authticon.session({ request });
89
+ // session.cookies — CookieStorageAdapter z metodami applyToResponse(), stringifySetCookies()
90
+ ```
91
+
92
+ #### Node.js — z własnym `CookieAdapter`
93
+
94
+ ```typescript
95
+ const session = await authticon.session({ cookies: myCookieAdapter });
96
+ ```
97
+
98
+ #### Przeglądarka
99
+
100
+ ```typescript
101
+ const session = await authticon.session({});
102
+ // Automatycznie używa document.cookie
103
+ ```
104
+
105
+ Opcjonalnie można przekazać `tokenStorage` do nadpisania nazw cookies i ich parametrów:
106
+
107
+ ```typescript
108
+ const session = await authticon.session({
109
+ request,
110
+ tokenStorage: {
111
+ accessTokenName: "my_access_token",
112
+ refreshTokenName: "my_refresh_token",
113
+ secure: true,
114
+ sameSite: "Strict",
115
+ domain: ".example.com",
116
+ },
117
+ });
118
+ ```
119
+
120
+ ### Metody sesji
121
+
122
+ #### Autentykacja
123
+
124
+ | Metoda | Opis |
125
+ |---|---|
126
+ | `login(params)` | Logowanie (email/password). Zwraca `SessionUser`. |
127
+ | `register(params)` | Rejestracja. Zwraca dane rejestracji (tokeny nie są jeszcze zapisywane). |
128
+ | `sendMagicLink(params)` | Wysyła magic link na email. |
129
+ | `loginWithMagicLink(params)` | Weryfikuje magic link i loguje użytkownika. Zwraca `SessionUser`. |
130
+ | `forgotPassword(params)` | Inicjuje reset hasła. |
131
+ | `verifyEmail(params)` | Weryfikuje email. |
132
+ | `createGuest(params)` | Tworzy użytkownika-gościa. Zwraca `SessionUser`. |
133
+ | `acceptInvitation(params)` | Akceptuje zaproszenie. Zwraca `SessionUser`. |
134
+ | `resendConfirmation(params)` | Ponownie wysyła email potwierdzający. |
135
+ | `logout()` | Wylogowuje (server-side + czyści cookies). |
136
+ | `refresh()` | Wymusza odświeżenie tokenów. |
137
+
138
+ #### Stan użytkownika
139
+
140
+ | Metoda | Opis |
141
+ |---|---|
142
+ | `getUser()` | Zwraca `SessionUser \| null`. |
143
+ | `requireUser()` | Zwraca `SessionUser` lub rzuca `AuthticonError`. |
144
+ | `hasSession()` | Zwraca `boolean` — czy istnieje access token. |
145
+ | `getFirstChallenge()` | Zwraca pierwszy challenge (np. `"verifyTwoFa"`, `"setPassword"`) lub `undefined`. |
146
+
147
+ #### Zarządzanie kontem
148
+
149
+ | Metoda | Opis |
150
+ |---|---|
151
+ | `changeEmail(params)` | Zmiana emaila. |
152
+ | `changePassword(params)` | Zmiana hasła. |
153
+ | `setPassword(params)` | Ustawienie hasła (np. po resecie). |
154
+ | `changePhone(params)` | Zmiana numeru telefonu. |
155
+ | `verifyPhone(params)` | Weryfikacja numeru telefonu. |
156
+
157
+ #### Dwuskładnikowe uwierzytelnianie (2FA)
158
+
159
+ | Metoda | Opis |
160
+ |---|---|
161
+ | `getTwoFaSecret()` | Pobiera sekret 2FA (do wyświetlenia QR code). |
162
+ | `enableTwoFa(params)` | Włącza 2FA. |
163
+ | `disableTwoFa(params)` | Wyłącza 2FA. |
164
+ | `sendTwoFaCode(params)` | Wysyła kod 2FA. |
165
+ | `completeTwoFaChallenge(code, remember?)` | Weryfikuje kod 2FA i aktualizuje sesję. |
166
+
167
+ #### Zaproszenia
168
+
169
+ | Metoda | Opis |
170
+ |---|---|
171
+ | `createInvitation(params)` | Tworzy zaproszenie. |
172
+ | `deleteInvitation(params)` | Usuwa zaproszenie. |
173
+
174
+ #### Tokeny
175
+
176
+ Obiekt `session.tokens` daje bezpośredni dostęp do tokenów:
177
+
178
+ ```typescript
179
+ session.tokens.getAccessToken(); // string | null
180
+ session.tokens.getRefreshToken(); // string | null
181
+ session.tokens.verify(); // weryfikuje aktualny access token
182
+ session.tokens.verify(customToken); // weryfikuje dowolny token
183
+ session.tokens.clear(); // czyści tokeny z cookies i resetuje stan sesji
184
+ ```
185
+
186
+ ### SessionUser
187
+
188
+ ```typescript
189
+ type SessionUser<Payload> = {
190
+ id: string; // ID użytkownika
191
+ sessionId: string; // ID sesji
192
+ projectId: string; // ID projektu
193
+ role: "guest" | "user";
194
+ isGuest: boolean;
195
+ challenges: Challenge[]; // np. ["verifyTwoFa", "setPassword"]
196
+ payload: Payload; // custom claims z tokena
197
+ raw: AccessTokenPayload; // surowy payload JWT
198
+ };
199
+ ```
200
+
201
+ ## Low-level API
202
+
203
+ Oprócz stanowej sesji, `createAuthticon()` udostępnia niskopoziomowe klienty API, które nie zarządzają stanem ani cookies.
204
+
205
+ ### `authticon.auth()` — klient publiczny (bez autoryzacji)
206
+
207
+ Bezstanowy klient do endpointów niewymagających tokenu:
208
+
209
+ ```typescript
210
+ const auth = authticon.auth();
211
+
212
+ await auth.login({ email: "user@example.com", password: "secret" });
213
+ await auth.register({ email: "user@example.com", password: "secret" });
214
+ await auth.forgotPassword({ email: "user@example.com" });
215
+ await auth.sendMagicLink({ email: "user@example.com" });
216
+ await auth.verifyMagicLink({ token: "..." });
217
+ await auth.verifyEmail({ token: "..." });
218
+ await auth.createGuestUser({ ... });
219
+ await auth.acceptInvitation({ token: "...", password: "..." });
220
+ await auth.resendConfirmation({ email: "..." });
221
+ ```
222
+
223
+ > **Uwaga:** Te metody zwracają surowe dane z API (np. tokeny). Zarządzanie cookies/stanem leży po stronie wywołującego.
224
+
225
+ ### `authticon.admin(options)` — klient administracyjny (tylko Node.js)
226
+
227
+ Wymaga klucza API. Służy do operacji administracyjnych:
228
+
229
+ ```typescript
230
+ const admin = authticon.admin({ apiKey: "your-api-key" });
231
+
232
+ await admin.listUsers({ page: 1 });
233
+ await admin.createUser({ email: "new@example.com", password: "..." });
234
+ await admin.getUser("user-id");
235
+ await admin.updateUser("user-id", { ... });
236
+ await admin.deleteUser("user-id");
237
+ await admin.loginAs({ userId: "user-id" });
238
+
239
+ // Role
240
+ await admin.createUserRole("user-id", { ... });
241
+ await admin.listUserRoles("user-id");
242
+ await admin.updateUserRole("user-id", "role-id", { ... });
243
+ await admin.deleteUserRole("user-id", "role-id");
244
+
245
+ // SMS
246
+ await admin.sendSmsCode("user-id");
247
+ await admin.verifySms("user-id", { code: "123456" });
248
+
249
+ // Test email
250
+ await admin.testEmail({ ... });
251
+ ```
252
+
253
+ ### `authticon.tokens` (tylko Node.js)
254
+
255
+ Bezpośredni dostęp do weryfikatora tokenów na poziomie instancji:
256
+
257
+ ```typescript
258
+ const payload = await authticon.tokens.verify(accessToken);
259
+ authticon.tokens.clearKeyCache(); // czyści cache kluczy JWKS
260
+ ```
261
+
262
+ ## Cookie adaptery
263
+
264
+ ### Node.js — `createNodeCookieStorageAdapter`
265
+
266
+ Parsuje cookies z `Request`, buforuje zmiany i pozwala je aplikować do `Response`:
267
+
268
+ ```typescript
269
+ import { createNodeCookieStorageAdapter } from "@authticon/client/node";
270
+
271
+ const cookies = createNodeCookieStorageAdapter(request);
272
+
273
+ // Po operacjach sesji:
274
+ cookies.applyToResponse(response);
275
+ // lub:
276
+ const setCookieHeaders = cookies.stringifySetCookies(); // string[]
277
+ ```
278
+
279
+ ### Przeglądarka — `createBrowserCookieAdapter`
280
+
281
+ Operuje bezpośrednio na `document.cookie`:
282
+
283
+ ```typescript
284
+ import { createBrowserCookieAdapter } from "@authticon/client/browser";
285
+
286
+ const cookies = createBrowserCookieAdapter();
287
+ ```
288
+
289
+ ### Własny adapter
290
+
291
+ Możesz zaimplementować interfejs `CookieAdapter`:
292
+
293
+ ```typescript
294
+ interface CookieAdapter {
295
+ get(name: string): string | null;
296
+ set(name: string, value: string, options: CookieSetOptions): void;
297
+ remove(name: string, options: CookieRemoveOptions): void;
298
+ }
299
+ ```
300
+
301
+ ## Token storage — konfiguracja cookies
302
+
303
+ ```typescript
304
+ type TokenStorageOptions = {
305
+ accessTokenName?: string; // domyślnie: "access_token"
306
+ refreshTokenName?: string; // domyślnie: "refresh_token"
307
+ deviceIdName?: string; // domyślnie: "device_id"
308
+ adminRefreshTokenName?: string; // domyślnie: "admin_refresh_token"
309
+ path?: string; // domyślnie: "/"
310
+ domain?: string;
311
+ secure?: boolean; // domyślnie: true
312
+ sameSite?: "Strict" | "Lax" | "None"; // domyślnie: "Lax"
313
+ accessTokenMaxAge?: number; // domyślnie: 900 (15 min)
314
+ refreshTokenMaxAge?: number; // domyślnie: 2592000 (30 dni)
315
+ };
316
+ ```
317
+
318
+ ## Obsługa błędów
319
+
320
+ Biblioteka definiuje dedykowaną hierarchię błędów:
321
+
322
+ ```typescript
323
+ import {
324
+ AuthticonError,
325
+ AuthticonApiError,
326
+ AuthticonTokenError,
327
+ isAuthticonError,
328
+ isAuthticonApiError,
329
+ isAuthticonTokenError,
330
+ } from "@authticon/client";
331
+ ```
332
+
333
+ | Klasa | Opis |
334
+ |---|---|
335
+ | `AuthticonError` | Bazowy błąd (np. brak tokenu, użytkownik niezalogowany) |
336
+ | `AuthticonApiError` | Błąd odpowiedzi API (zawiera `statusCode` i `response`) |
337
+ | `AuthticonTokenError` | Błąd weryfikacji JWT (zawiera `code` i oryginalny `joseError`) |
338
+
339
+ ```typescript
340
+ try {
341
+ const user = session.requireUser();
342
+ } catch (error) {
343
+ if (isAuthticonApiError(error)) {
344
+ console.log(error.statusCode); // np. 401
345
+ }
346
+ if (isAuthticonTokenError(error, "ERR_JWT_EXPIRED")) {
347
+ // Token wygasł
348
+ }
349
+ }
350
+ ```
351
+
352
+ ## Typowanie custom payloadu
353
+
354
+ Biblioteka wspiera generyczne typowanie payloadu JWT:
355
+
356
+ ```typescript
357
+ type MyPayload = {
358
+ organizationId: string;
359
+ permissions: string[];
360
+ };
361
+
362
+ const authticon = createAuthticon<MyPayload>({
363
+ projectId: "...",
364
+ });
365
+
366
+ const session = await authticon.session({ request });
367
+ const user = session.getUser();
368
+
369
+ user?.payload.organizationId; // string
370
+ user?.payload.permissions; // string[]
371
+ ```
372
+
373
+ ## Licencja
374
+
375
+ MIT
@@ -0,0 +1,15 @@
1
+ import type { CookieAdapter, CookieSetOptions } from "./types.js";
2
+ export declare class CookieStorageAdapter implements CookieAdapter {
3
+ private readonly cookies;
4
+ private readonly setCookies;
5
+ private readonly values;
6
+ constructor(request: Request);
7
+ get(name: string): string | null;
8
+ set(name: string, value: string, options: CookieSetOptions): void;
9
+ remove(name: string): void;
10
+ stringifySetCookies(): string[];
11
+ stringifyCookies(): string;
12
+ applyToResponse(response: Response): void;
13
+ }
14
+ export declare function createCookieStorageAdapter(request: Request): CookieStorageAdapter;
15
+ //# sourceMappingURL=CookieStorageAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CookieStorageAdapter.d.ts","sourceRoot":"","sources":["../src/CookieStorageAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAElE,qBAAa,oBAAqB,YAAW,aAAa;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8C;IACzE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;gBAE7C,OAAO,EAAE,OAAO;IAmB5B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIhC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB;IAW1D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAY1B,mBAAmB,IAAI,MAAM,EAAE;IAM/B,gBAAgB,IAAI,MAAM;IAI1B,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;CAM1C;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,GACf,oBAAoB,CAEtB"}
@@ -0,0 +1,60 @@
1
+ import * as cookiesUtils from "cookie";
2
+ export class CookieStorageAdapter {
3
+ cookies;
4
+ setCookies = {};
5
+ values = new Map();
6
+ constructor(request) {
7
+ this.cookies = cookiesUtils.parseCookie(request.headers.get("Cookie") || "");
8
+ for (const [name, value] of Object.entries(this.cookies)) {
9
+ if (value) {
10
+ this.values.set(name, value);
11
+ }
12
+ }
13
+ for (const raw of request.headers.getSetCookie()) {
14
+ const cookie = cookiesUtils.parseSetCookie(raw);
15
+ this.setCookies[cookie.name] = cookie;
16
+ if (cookie.value) {
17
+ this.values.set(cookie.name, cookie.value);
18
+ }
19
+ }
20
+ }
21
+ get(name) {
22
+ return this.values.get(name) ?? null;
23
+ }
24
+ set(name, value, options) {
25
+ this.values.set(name, value);
26
+ this.setCookies[name] = {
27
+ name,
28
+ value,
29
+ ...options,
30
+ sameSite: options.sameSite.toLowerCase(),
31
+ };
32
+ }
33
+ remove(name) {
34
+ this.values.delete(name);
35
+ delete this.cookies[name];
36
+ this.setCookies[name] = {
37
+ name,
38
+ value: "",
39
+ secure: true,
40
+ sameSite: "none",
41
+ maxAge: 0,
42
+ };
43
+ }
44
+ stringifySetCookies() {
45
+ return Object.values(this.setCookies).map((cookie) => cookiesUtils.stringifySetCookie(cookie));
46
+ }
47
+ stringifyCookies() {
48
+ return cookiesUtils.stringifyCookie(this.cookies);
49
+ }
50
+ applyToResponse(response) {
51
+ response.headers.set("Cookie", this.stringifyCookies());
52
+ for (const cookie of this.stringifySetCookies()) {
53
+ response.headers.append("Set-Cookie", cookie);
54
+ }
55
+ }
56
+ }
57
+ export function createCookieStorageAdapter(request) {
58
+ return new CookieStorageAdapter(request);
59
+ }
60
+ //# sourceMappingURL=CookieStorageAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CookieStorageAdapter.js","sourceRoot":"","sources":["../src/CookieStorageAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,QAAQ,CAAC;AAGvC,MAAM,OAAO,oBAAoB;IACd,OAAO,CAAuB;IAC9B,UAAU,GAA2C,EAAE,CAAC;IACxD,MAAM,GAAwB,IAAI,GAAG,EAAE,CAAC;IAEzD,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,WAAW,CACrC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CACpC,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACzD,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAChD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;YACtC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IACvC,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,OAAyB;QACxD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG;YACtB,IAAI;YACJ,KAAK;YACL,GAAG,OAAO;YACV,QAAQ,EACN,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAwC;SACvE,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG;YACtB,IAAI;YACJ,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,MAAM;YAChB,MAAM,EAAE,CAAC;SACV,CAAC;IACJ,CAAC;IAED,mBAAmB;QACjB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACnD,YAAY,CAAC,kBAAkB,CAAC,MAAM,CAAC,CACxC,CAAC;IACJ,CAAC;IAED,gBAAgB;QACd,OAAO,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,eAAe,CAAC,QAAkB;QAChC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACxD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAChD,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,0BAA0B,CACxC,OAAgB;IAEhB,OAAO,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CacheAdapter } from "./types.js";
2
+ export declare const createInMemoryCacheAdapter: () => CacheAdapter;
3
+ //# sourceMappingURL=InMemoryCacheAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryCacheAdapter.d.ts","sourceRoot":"","sources":["../src/InMemoryCacheAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,eAAO,MAAM,0BAA0B,QAAO,YAY7C,CAAC"}
@@ -0,0 +1,13 @@
1
+ export const createInMemoryCacheAdapter = () => {
2
+ const store = new Map();
3
+ return {
4
+ get: (key) => store.get(key),
5
+ set: (key, value) => {
6
+ store.set(key, value);
7
+ },
8
+ delete: (key) => {
9
+ store.delete(key);
10
+ },
11
+ };
12
+ };
13
+ //# sourceMappingURL=InMemoryCacheAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryCacheAdapter.js","sourceRoot":"","sources":["../src/InMemoryCacheAdapter.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAiB,EAAE;IAC3D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IAEzC,OAAO;QACL,GAAG,EAAE,CAAI,GAAW,EAAiB,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAkB;QACvE,GAAG,EAAE,CAAI,GAAW,EAAE,KAAQ,EAAQ,EAAE;YACtC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,MAAM,EAAE,CAAC,GAAW,EAAQ,EAAE;YAC5B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -1,17 +1,21 @@
1
+ import type { Logger } from "pino";
1
2
  import type { CookieAdapter, TokenPair, TokenStorageOptions } from "./types.js";
2
- export declare class TokenStorage {
3
- private readonly cookies;
4
- private readonly accessName;
5
- private readonly refreshName;
6
- private readonly deviceIdName;
7
- private readonly setOptions;
8
- private readonly removeOptions;
9
- constructor(cookies: CookieAdapter, options?: TokenStorageOptions);
3
+ export type TokenStorage = {
10
4
  readonly save: (tokens: TokenPair) => void;
5
+ readonly clear: () => void;
11
6
  readonly getAccessToken: () => string | null;
12
7
  readonly getRefreshToken: () => string | null;
13
8
  readonly getDeviceId: () => string | null;
9
+ readonly getAdminRefreshToken: () => string | null;
10
+ readonly setAccessToken: (accessToken: string) => void;
11
+ readonly setRefreshToken: (refreshToken: string) => void;
12
+ readonly setAdminRefreshToken: (adminRefreshToken: string) => void;
13
+ readonly setDeviceId: (deviceId: string) => void;
14
+ readonly clearAccessToken: () => void;
15
+ readonly clearRefreshToken: () => void;
16
+ readonly clearDeviceId: () => void;
17
+ readonly clearAdminRefreshToken: () => void;
14
18
  readonly getAll: () => TokenPair | null;
15
- readonly clear: () => void;
16
- }
19
+ };
20
+ export declare const createTokenStorage: (cookies: CookieAdapter, options?: TokenStorageOptions, logger?: Logger) => TokenStorage;
17
21
  //# sourceMappingURL=TokenStorage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TokenStorage.d.ts","sourceRoot":"","sources":["../src/TokenStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAGb,SAAS,EACT,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAQpB,qBAAa,YAAY;IAYrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAX1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAIzB;IACF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB;gBAGjC,OAAO,EAAE,aAAa,EACvC,OAAO,GAAE,mBAAwB;IAsCnC,QAAQ,CAAC,IAAI,GAAI,QAAQ,SAAS,KAAG,IAAI,CAIvC;IAEF,QAAQ,CAAC,cAAc,QAAO,MAAM,GAAG,IAAI,CACP;IAEpC,QAAQ,CAAC,eAAe,QAAO,MAAM,GAAG,IAAI,CACP;IAErC,QAAQ,CAAC,WAAW,QAAO,MAAM,GAAG,IAAI,CACF;IAEtC,QAAQ,CAAC,MAAM,QAAO,SAAS,GAAG,IAAI,CAMpC;IAEF,QAAQ,CAAC,KAAK,QAAO,IAAI,CAGvB;CACH"}
1
+ {"version":3,"file":"TokenStorage.d.ts","sourceRoot":"","sources":["../src/TokenStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EACV,aAAa,EAGb,SAAS,EACT,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAUpB,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,YAuGF,CAAC"}