@authticon/client 0.0.0-beta9 → 0.0.4

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 +418 -0
  2. package/dist/authticon.d.ts +147 -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 +153 -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 +43 -0
  15. package/dist/clients/auth.d.ts.map +1 -0
  16. package/dist/clients/auth.js +83 -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 +202 -0
  60. package/dist/clients/generated/sdk.gen.d.ts.map +1 -0
  61. package/dist/clients/generated/sdk.gen.js +510 -0
  62. package/dist/clients/generated/sdk.gen.js.map +1 -0
  63. package/dist/clients/generated/types.gen.d.ts +1541 -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 +86 -0
  67. package/dist/clients/user.d.ts.map +1 -0
  68. package/dist/clients/user.js +96 -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 +172 -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 +115 -0
  91. package/dist/session.d.ts.map +1 -0
  92. package/dist/session.js +240 -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 -87
  110. package/dist/Authticon.d.ts.map +0 -1
  111. package/dist/Authticon.js +0 -74
  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 -24
  142. package/dist/TokenManager.d.ts.map +0 -1
  143. package/dist/TokenManager.js +0 -53
  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 -18
  150. package/dist/TokenStorage.d.ts.map +0 -1
  151. package/dist/TokenStorage.js +0 -69
  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 -10
  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 -50
  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
package/README.md ADDED
@@ -0,0 +1,418 @@
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
+ | `loginByMagicLink(params)` | Loguje użytkownika przez magic link (z `deviceId`). Zwraca `SessionUser`. |
129
+ | `forgotPassword(params)` | Inicjuje reset hasła. |
130
+ | `verifyEmail(params)` | Weryfikuje email. |
131
+ | `createGuest(params)` | Tworzy użytkownika-gościa. Zwraca `SessionUser`. |
132
+ | `acceptInvitation(params)` | Akceptuje zaproszenie. Zwraca `SessionUser`. |
133
+ | `resendConfirmation(params)` | Ponownie wysyła email potwierdzający. |
134
+ | `logout()` | Wylogowuje (server-side + czyści cookies). |
135
+ | `refresh()` | Wymusza odświeżenie tokenów. |
136
+
137
+ #### Stan użytkownika
138
+
139
+ | Metoda | Opis |
140
+ | --------------------- | --------------------------------------------------------------------------------- |
141
+ | `getUser()` | Zwraca `SessionUser \| null`. |
142
+ | `requireUser()` | Zwraca `SessionUser` lub rzuca `AuthticonError`. |
143
+ | `isLoggedIn()` | Zwraca `boolean` — czy istnieje refresh token (sesja aktywna). |
144
+ | `isLoggedInByAdmin()` | Zwraca `boolean` — czy istnieje admin refresh token (logowanie jako użytkownik). |
145
+ | `getFirstChallenge()` | Zwraca pierwszy challenge (np. `"verifyTwoFa"`, `"setPassword"`) lub `undefined`. |
146
+
147
+ #### Profil użytkownika
148
+
149
+ | Metoda | Opis |
150
+ | ------------------ | -------------------------------------------- |
151
+ | `getMe()` | Pobiera dane zalogowanego użytkownika z API. |
152
+ | `updateMe(params)` | Aktualizuje dane zalogowanego użytkownika. |
153
+
154
+ #### Zarządzanie kontem
155
+
156
+ | Metoda | Opis |
157
+ | ------------------------ | ---------------------------------- |
158
+ | `changeEmail(params)` | Zmiana emaila. |
159
+ | `changePassword(params)` | Zmiana hasła. |
160
+ | `setPassword(params)` | Ustawienie hasła (np. po resecie). |
161
+ | `changePhone(params)` | Zmiana numeru telefonu. |
162
+ | `verifyPhone(params)` | Weryfikacja numeru telefonu. |
163
+
164
+ #### Dwuskładnikowe uwierzytelnianie (2FA)
165
+
166
+ | Metoda | Opis |
167
+ | ---------------------------------- | ------------------------------------------------------------- |
168
+ | `getTwoFaSecret()` | Pobiera sekret 2FA (do wyświetlenia QR code). |
169
+ | `enableTwoFa(params)` | Włącza 2FA. |
170
+ | `disableTwoFa(params)` | Wyłącza 2FA. |
171
+ | `sendTwoFaCode(params)` | Wysyła kod 2FA. |
172
+ | `verifyTwoFaCode(code, remember?)` | Weryfikuje kod 2FA i aktualizuje sesję. Zwraca `SessionUser`. |
173
+
174
+ #### Social OAuth (Google, Facebook, GitHub)
175
+
176
+ Logowanie i linkowanie kont przez zewnętrznych dostawców OAuth. Session automatycznie wybiera odpowiedni flow:
177
+
178
+ - **Niezalogowany** — `socialAuthorize` / `socialExchange` inicjuje logowanie/rejestrację
179
+ - **Zalogowany** — te same metody linkują konto social do istniejącego użytkownika
180
+
181
+ ```typescript
182
+ // 1. Pobierz URL autoryzacji i przekieruj użytkownika
183
+ const { authorizationUrl } = await session.socialAuthorize("google", "https://app.example.com/callback");
184
+ // redirect(authorizationUrl)
185
+
186
+ // 2. Po powrocie z providera (w callback route) — wymień code na sesję
187
+ const user = await session.socialExchange("google", code, state);
188
+ // user jest zalogowany (lub konto zostało zlinkowane)
189
+ ```
190
+
191
+ | Metoda | Opis |
192
+ | ------------------------------------------- | -------------------------------------------------------------------------- |
193
+ | `socialAuthorize(provider, redirectUri)` | Generuje URL autoryzacji OAuth. Zalogowany? Linkuje. Niezalogowany? Loguje.|
194
+ | `socialExchange(provider, code, state)` | Wymienia code+state na sesję. Zalogowany? Linkuje. Niezalogowany? Loguje. |
195
+ | `getSocialAccounts()` | Lista powiązanych kont social (wymaga zalogowania). |
196
+ | `socialUnlink(provider)` | Odłącza konto social (wymaga zalogowania). |
197
+
198
+ #### Zaproszenia
199
+
200
+ | Metoda | Opis |
201
+ | -------------------------- | ------------------- |
202
+ | `createInvitation(params)` | Tworzy zaproszenie. |
203
+ | `deleteInvitation(params)` | Usuwa zaproszenie. |
204
+
205
+ #### Tokeny
206
+
207
+ Obiekt `session.tokens` daje bezpośredni dostęp do tokenów:
208
+
209
+ ```typescript
210
+ session.tokens.getAccessToken(); // string | null
211
+ session.tokens.getRefreshToken(); // string | null
212
+ session.tokens.verify(); // weryfikuje aktualny access token
213
+ session.tokens.verify(customToken); // weryfikuje dowolny token
214
+ session.tokens.clear(); // czyści tokeny z cookies i resetuje stan sesji
215
+ ```
216
+
217
+ ### SessionUser
218
+
219
+ ```typescript
220
+ type SessionUser<Payload> = {
221
+ id: string; // ID użytkownika
222
+ sessionId: string; // ID sesji
223
+ projectId: string; // ID projektu
224
+ role: "guest" | "user";
225
+ isGuest: boolean;
226
+ challenges: Challenge[]; // np. ["verifyTwoFa", "setPassword"]
227
+ payload: Payload; // custom claims z tokena
228
+ raw: AccessTokenPayload; // surowy payload JWT
229
+ };
230
+ ```
231
+
232
+ ## Low-level API
233
+
234
+ Oprócz stanowej sesji, `createAuthticon()` udostępnia niskopoziomowe klienty API, które nie zarządzają stanem ani cookies.
235
+
236
+ ### `authticon.auth()` — klient publiczny (bez autoryzacji)
237
+
238
+ Bezstanowy klient do endpointów niewymagających tokenu:
239
+
240
+ ```typescript
241
+ const auth = authticon.auth();
242
+
243
+ await auth.login({ email: "user@example.com", password: "secret" });
244
+ await auth.register({ email: "user@example.com", password: "secret" });
245
+ await auth.forgotPassword({ email: "user@example.com" });
246
+ await auth.loginByMagicLink({ token: "..." });
247
+ await auth.verifyEmail({ token: "..." });
248
+ await auth.createGuestUser({ ... });
249
+ await auth.acceptInvitation({ token: "...", password: "..." });
250
+ await auth.resendConfirmation({ email: "..." });
251
+
252
+ // Social OAuth
253
+ await auth.socialAuthorize("google", { redirectUri: "https://app.example.com/callback" });
254
+ await auth.socialExchange("google", { code: "...", state: "..." });
255
+ ```
256
+
257
+ > **Uwaga:** Te metody zwracają surowe dane z API (np. tokeny). Zarządzanie cookies/stanem leży po stronie wywołującego.
258
+
259
+ ### `authticon.admin(options)` — klient administracyjny (tylko Node.js)
260
+
261
+ Wymaga klucza API. Służy do operacji administracyjnych:
262
+
263
+ ```typescript
264
+ const admin = authticon.admin({ apiKey: "your-api-key" });
265
+
266
+ await admin.listUsers({ page: 1 });
267
+ await admin.createUser({ email: "new@example.com", password: "..." });
268
+ await admin.getUser("user-id");
269
+ await admin.updateUser("user-id", { ... });
270
+ await admin.deleteUser("user-id");
271
+ await admin.loginAs({ userId: "user-id" });
272
+ await admin.sendMagicLink({ email: "user@example.com", url: "https://example.com/login" });
273
+
274
+
275
+ // Role
276
+ await admin.createUserRole("user-id", { ... });
277
+ await admin.listUserRoles("user-id");
278
+ await admin.updateUserRole("user-id", "role-id", { ... });
279
+ await admin.deleteUserRole("user-id", "role-id");
280
+
281
+ // Magic link
282
+ await admin.sendMagicLink({ email: "user@example.com" });
283
+
284
+ // SMS
285
+ await admin.sendSmsCode("user-id");
286
+ await admin.verifySms("user-id", { code: "123456" });
287
+
288
+ // Dostępność
289
+ await admin.isEmailAvailable("user@example.com"); // boolean
290
+ await admin.isPhoneAvailable("+48123456789"); // boolean
291
+
292
+ // Test email
293
+ await admin.testEmail({ ... });
294
+ ```
295
+
296
+ ### `authticon.tokens` (tylko Node.js)
297
+
298
+ Bezpośredni dostęp do weryfikatora tokenów na poziomie instancji:
299
+
300
+ ```typescript
301
+ const payload = await authticon.tokens.verify(accessToken);
302
+ authticon.tokens.clearKeyCache(); // czyści cache kluczy JWKS
303
+ ```
304
+
305
+ ## Cookie adaptery
306
+
307
+ ### Node.js — `createNodeCookieStorageAdapter`
308
+
309
+ Parsuje cookies z `Request`, buforuje zmiany i pozwala je aplikować do `Response`:
310
+
311
+ ```typescript
312
+ import { createNodeCookieStorageAdapter } from "@authticon/client/node";
313
+
314
+ const cookies = createNodeCookieStorageAdapter(request);
315
+
316
+ // Po operacjach sesji:
317
+ cookies.applyToResponse(response);
318
+ // lub:
319
+ const setCookieHeaders = cookies.stringifySetCookies(); // string[]
320
+ ```
321
+
322
+ ### Przeglądarka — `createBrowserCookieAdapter`
323
+
324
+ Operuje bezpośrednio na `document.cookie`:
325
+
326
+ ```typescript
327
+ import { createBrowserCookieAdapter } from "@authticon/client/browser";
328
+
329
+ const cookies = createBrowserCookieAdapter();
330
+ ```
331
+
332
+ ### Własny adapter
333
+
334
+ Możesz zaimplementować interfejs `CookieAdapter`:
335
+
336
+ ```typescript
337
+ interface CookieAdapter {
338
+ get(name: string): string | null;
339
+ set(name: string, value: string, options: CookieSetOptions): void;
340
+ remove(name: string, options: CookieRemoveOptions): void;
341
+ }
342
+ ```
343
+
344
+ ## Token storage — konfiguracja cookies
345
+
346
+ ```typescript
347
+ type TokenStorageOptions = {
348
+ accessTokenName?: string; // domyślnie: "access_token"
349
+ refreshTokenName?: string; // domyślnie: "refresh_token"
350
+ deviceIdName?: string; // domyślnie: "device_id"
351
+ adminRefreshTokenName?: string; // domyślnie: "admin_refresh_token"
352
+ path?: string; // domyślnie: "/"
353
+ domain?: string;
354
+ secure?: boolean; // domyślnie: true
355
+ sameSite?: "Strict" | "Lax" | "None"; // domyślnie: "Lax"
356
+ accessTokenMaxAge?: number; // domyślnie: 900 (15 min)
357
+ refreshTokenMaxAge?: number; // domyślnie: 2592000 (30 dni)
358
+ };
359
+ ```
360
+
361
+ ## Obsługa błędów
362
+
363
+ Biblioteka definiuje dedykowaną hierarchię błędów:
364
+
365
+ ```typescript
366
+ import {
367
+ AuthticonError,
368
+ AuthticonApiError,
369
+ AuthticonTokenError,
370
+ isAuthticonError,
371
+ isAuthticonApiError,
372
+ isAuthticonTokenError,
373
+ } from "@authticon/client";
374
+ ```
375
+
376
+ | Klasa | Opis |
377
+ | --------------------- | -------------------------------------------------------------- |
378
+ | `AuthticonError` | Bazowy błąd (np. brak tokenu, użytkownik niezalogowany) |
379
+ | `AuthticonApiError` | Błąd odpowiedzi API (zawiera `statusCode` i `response`) |
380
+ | `AuthticonTokenError` | Błąd weryfikacji JWT (zawiera `code` i oryginalny `joseError`) |
381
+
382
+ ```typescript
383
+ try {
384
+ const user = session.requireUser();
385
+ } catch (error) {
386
+ if (isAuthticonApiError(error)) {
387
+ console.log(error.statusCode); // np. 401
388
+ }
389
+ if (isAuthticonTokenError(error, "ERR_JWT_EXPIRED")) {
390
+ // Token wygasł
391
+ }
392
+ }
393
+ ```
394
+
395
+ ## Typowanie custom payloadu
396
+
397
+ Biblioteka wspiera generyczne typowanie payloadu JWT:
398
+
399
+ ```typescript
400
+ type MyPayload = {
401
+ organizationId: string;
402
+ permissions: string[];
403
+ };
404
+
405
+ const authticon = createAuthticon<MyPayload>({
406
+ projectId: "...",
407
+ });
408
+
409
+ const session = await authticon.session({ request });
410
+ const user = session.getUser();
411
+
412
+ user?.payload.organizationId; // string
413
+ user?.payload.permissions; // string[]
414
+ ```
415
+
416
+ ## Licencja
417
+
418
+ MIT
@@ -0,0 +1,147 @@
1
+ import type { AuthticonOptions, CookieAdapter, DefaultAccessTokenPayload, TokenStorageOptions } from "./types.js";
2
+ export type CookieAdapterFactory<SessionOpts> = (options: SessionOpts) => CookieAdapter;
3
+ export declare const createBaseAuthticon: <Payload extends Record<string, any> = DefaultAccessTokenPayload, SessionOpts extends {
4
+ tokenStorage?: TokenStorageOptions;
5
+ } = {
6
+ tokenStorage?: TokenStorageOptions;
7
+ }>(options: AuthticonOptions, buildCookieAdapter: CookieAdapterFactory<SessionOpts>) => {
8
+ session: (sessionOptions: SessionOpts) => Promise<{
9
+ login: (params: import("./clients/generated/types.gen.js").LoginData["body"]) => Promise<import("./types.js").SessionUser<Payload>>;
10
+ loginByMagicLink: (params: import("./clients/generated/types.gen.js").LoginByMagicLinkData["body"]) => Promise<import("./types.js").SessionUser<Payload>>;
11
+ loginAs: (admin: import("./clients/admin.js").AdminClient, targetUserId: string) => Promise<import("./types.js").SessionUser<Payload> | null>;
12
+ backToAdmin: () => Promise<import("./types.js").SessionUser<Payload> | null>;
13
+ register: (params: import("./clients/generated/types.gen.js").RegisterData["body"]) => Promise<{
14
+ userId: string;
15
+ }>;
16
+ forgotPassword: (params: import("./clients/generated/types.gen.js").ForgotPasswordData["body"]) => Promise<null>;
17
+ verifyEmail: (token: string) => Promise<void>;
18
+ createGuest: (params: import("./clients/generated/types.gen.js").CreateGuestUserData["body"]) => Promise<import("./types.js").SessionUser<Payload>>;
19
+ acceptInvitation: (params: import("./clients/generated/types.gen.js").AcceptInvitationData["body"]) => Promise<import("./types.js").SessionUser<Payload>>;
20
+ resendConfirmation: (params: import("./clients/generated/types.gen.js").ResendEmailConfirmationData["body"]) => Promise<null>;
21
+ getMe: () => Promise<{
22
+ id: string;
23
+ email: string;
24
+ firstName: string | null;
25
+ lastName: string | null;
26
+ isGuest: boolean;
27
+ claims: unknown;
28
+ phone: string | null;
29
+ locale: string;
30
+ passwordUpdatedAt: string | null;
31
+ hasPassword: boolean;
32
+ twoFaEnabled: boolean;
33
+ twoFaType: "APP" | "EMAIL" | "PHONE";
34
+ isBlocked: boolean;
35
+ isBlockedUntil: string | null;
36
+ phoneVerified: boolean;
37
+ emailVerified: boolean;
38
+ roles: Array<{
39
+ id: string;
40
+ role: string;
41
+ group: string;
42
+ }>;
43
+ metadata: {
44
+ [key: string]: unknown;
45
+ };
46
+ }>;
47
+ updateUser: (params: import("./clients/generated/types.gen.js").UpdateMeData["body"]) => Promise<{
48
+ id: string;
49
+ }>;
50
+ updateMe: (params: import("./clients/generated/types.gen.js").UpdateMeData["body"]) => Promise<{
51
+ id: string;
52
+ }>;
53
+ getUser: () => import("./types.js").SessionUser<Payload> | null;
54
+ requireUser: () => import("./types.js").SessionUser<Payload>;
55
+ getFirstChallenge: () => import("./types.js").Challenge | undefined;
56
+ isLoggedIn: () => boolean;
57
+ isLoggedInByAdmin: () => boolean;
58
+ logout: () => Promise<void>;
59
+ refresh: () => Promise<void>;
60
+ getDeviceId: () => string | null;
61
+ changeEmail: (params: import("./clients/generated/types.gen.js").ChangeEmailData["body"]) => Promise<null>;
62
+ changePassword: (params: import("./clients/generated/types.gen.js").ChangePasswordData["body"]) => Promise<null>;
63
+ setPassword: (params: import("./clients/generated/types.gen.js").SetPasswordData["body"]) => Promise<null>;
64
+ changePhone: (params: import("./clients/generated/types.gen.js").ChangePhoneData["body"]) => Promise<null>;
65
+ verifyPhone: (params: import("./clients/generated/types.gen.js").VerifyPhoneData["body"]) => Promise<null>;
66
+ getTwoFaSecret: () => Promise<{
67
+ secret: string;
68
+ uri: string;
69
+ }>;
70
+ enableTwoFa: (params: import("./clients/generated/types.gen.js").EnableTwoFaData["body"]) => Promise<void>;
71
+ disableTwoFa: (params: import("./clients/generated/types.gen.js").DisableTwoFaData["body"]) => Promise<void>;
72
+ sendTwoFaCode: (params: import("./clients/generated/types.gen.js").SendTwoFaCodeData["body"]) => Promise<void>;
73
+ verifyTwoFaCode: (code: string, remember?: boolean) => Promise<import("./types.js").SessionUser<Payload>>;
74
+ createInvitation: (params: import("./clients/generated/types.gen.js").CreateInvitationData["body"]) => Promise<{
75
+ id: string;
76
+ email: string;
77
+ token: string;
78
+ validTo: string;
79
+ role: string | null;
80
+ group: string | null;
81
+ returnUrl: string | null;
82
+ }>;
83
+ deleteInvitation: (params: import("./clients/generated/types.gen.js").DeleteInvitationData["path"]) => Promise<{
84
+ id: string;
85
+ }>;
86
+ socialAuthorize: (provider: "google" | "facebook" | "github", redirectUri: string) => Promise<{
87
+ authorizationUrl: string;
88
+ }>;
89
+ socialExchange: (provider: "google" | "facebook" | "github", code: string, state: string) => Promise<{
90
+ provider: string;
91
+ providerUserId: string;
92
+ } | import("./types.js").SessionUser<Payload>>;
93
+ getSocialAccounts: () => Promise<{
94
+ id: string;
95
+ provider: string;
96
+ providerUserId: string;
97
+ createdAt: string;
98
+ }[]>;
99
+ socialUnlink: (provider: "google" | "facebook" | "github") => Promise<{
100
+ success: boolean;
101
+ }>;
102
+ tokens: {
103
+ getAccessToken: () => string | null;
104
+ getRefreshToken: () => string | null;
105
+ verify: (token?: string) => Promise<import("./types.js").AccessTokenPayload<Payload>>;
106
+ clear: () => void;
107
+ };
108
+ cookies: CookieAdapter;
109
+ }>;
110
+ auth: () => {
111
+ login: (params: import("./clients/generated/types.gen.js").LoginData["body"]) => Promise<{
112
+ accessToken: string;
113
+ refreshToken: string;
114
+ deviceId: string;
115
+ sessionId: string;
116
+ }>;
117
+ loginByMagicLink: (params: import("./clients/generated/types.gen.js").LoginByMagicLinkData["body"]) => Promise<{
118
+ accessToken: string;
119
+ refreshToken: string;
120
+ deviceId: string;
121
+ sessionId: string;
122
+ }>;
123
+ register: (params: import("./clients/generated/types.gen.js").RegisterData["body"]) => Promise<{
124
+ userId: string;
125
+ }>;
126
+ forgotPassword: (params: import("./clients/generated/types.gen.js").ForgotPasswordData["body"]) => Promise<null>;
127
+ createGuestUser: (params: import("./clients/generated/types.gen.js").CreateGuestUserData["body"]) => Promise<{
128
+ token: string;
129
+ }>;
130
+ acceptInvitation: (params: import("./clients/generated/types.gen.js").AcceptInvitationData["body"]) => Promise<{
131
+ accessToken: string;
132
+ refreshToken: string;
133
+ }>;
134
+ verifyEmail: (params: import("./clients/generated/types.gen.js").VerifyEmailData["body"]) => Promise<void>;
135
+ resendConfirmation: (params: import("./clients/generated/types.gen.js").ResendEmailConfirmationData["body"]) => Promise<null>;
136
+ socialAuthorize: (provider: import("./clients/generated/types.gen.js").SocialAuthorizeData["path"]["provider"], params: import("./clients/generated/types.gen.js").SocialAuthorizeData["body"]) => Promise<{
137
+ authorizationUrl: string;
138
+ }>;
139
+ socialExchange: (provider: import("./clients/generated/types.gen.js").SocialExchangeData["path"]["provider"], params: import("./clients/generated/types.gen.js").SocialExchangeData["body"]) => Promise<{
140
+ accessToken: string;
141
+ refreshToken: string;
142
+ deviceId: string;
143
+ sessionId: string;
144
+ }>;
145
+ };
146
+ };
147
+ //# sourceMappingURL=authticon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authticon.d.ts","sourceRoot":"","sources":["../src/authticon.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,yBAAyB,EACzB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAIpB,MAAM,MAAM,oBAAoB,CAAC,WAAW,IAAI,CAC9C,OAAO,EAAE,WAAW,KACjB,aAAa,CAAC;AAEnB,eAAO,MAAM,mBAAmB,GAC9B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,yBAAyB,EAC/D,WAAW,SAAS;IAAE,YAAY,CAAC,EAAE,mBAAmB,CAAA;CAAE,GAAG;IAC3D,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC,EAED,SAAS,gBAAgB,EACzB,oBAAoB,oBAAoB,CAAC,WAAW,CAAC;8BAoBzB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAeowB,sEAA4B;;;mCAAoQ,qEAA2B;;;;;;;CADvmC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { createAuthClient } from "./clients/auth.js";
2
+ import { createSession } from "./session.js";
3
+ import { createTokenVerifier } from "./tokens.js";
4
+ const DEFAULT_BASE_URL = "https://authticon.com";
5
+ export const createBaseAuthticon = (options, buildCookieAdapter) => {
6
+ const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;
7
+ const jwksUrl = options.jwksUrl ?? `${baseUrl}/.well-known/jwks.json`;
8
+ const verifier = createTokenVerifier(jwksUrl, options.jwksCacheTtlMs, options.logger?.child({ authticon: "token-verifier" }), options.cache);
9
+ const deps = {
10
+ projectId: options.projectId,
11
+ baseUrl,
12
+ verifier,
13
+ logger: options.logger,
14
+ };
15
+ return {
16
+ session: (sessionOptions) => createSession(deps, buildCookieAdapter(sessionOptions), sessionOptions.tokenStorage),
17
+ auth: () => createAuthClient({
18
+ projectId: options.projectId,
19
+ baseUrl,
20
+ logger: options.logger,
21
+ }),
22
+ };
23
+ };
24
+ //# sourceMappingURL=authticon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authticon.js","sourceRoot":"","sources":["../src/authticon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,aAAa,EAA0B,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQlD,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAMjD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAMjC,OAAyB,EACzB,kBAAqD,EACrD,EAAE;IACF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,gBAAgB,CAAC;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,GAAG,OAAO,wBAAwB,CAAC;IAEtE,MAAM,QAAQ,GAAG,mBAAmB,CAClC,OAAO,EACP,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,EACtD,OAAO,CAAC,KAAK,CACd,CAAC;IAEF,MAAM,IAAI,GAAsB;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO;QACP,QAAQ;QACR,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,CAAC,cAA2B,EAAE,EAAE,CACvC,aAAa,CACX,IAAI,EACJ,kBAAkB,CAAC,cAAc,CAAC,EAClC,cAAc,CAAC,YAAY,CAC5B;QAEH,IAAI,EAAE,GAAG,EAAE,CACT,gBAAgB,CAAC;YACf,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO;YACP,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;KACL,CAAC;AACJ,CAAC,CAAC"}