@sentroy-co/client-sdk 2.13.7 → 2.13.9
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.
- package/dist/auth/admin/index.d.ts +153 -0
- package/dist/auth/admin/index.d.ts.map +1 -0
- package/dist/auth/admin/index.js +228 -0
- package/dist/auth/admin/index.js.map +1 -0
- package/dist/auth/client.d.ts +212 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +623 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/http.d.ts +19 -0
- package/dist/auth/http.d.ts.map +1 -0
- package/dist/auth/http.js +74 -0
- package/dist/auth/http.js.map +1 -0
- package/dist/auth/index.d.ts +16 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +20 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/react/index.d.ts +100 -0
- package/dist/auth/react/index.d.ts.map +1 -0
- package/dist/auth/react/index.js +231 -0
- package/dist/auth/react/index.js.map +1 -0
- package/dist/auth/types.d.ts +105 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +21 -0
- package/dist/auth/types.js.map +1 -0
- package/package.json +20 -1
- package/src/auth/admin/index.ts +387 -0
- package/src/auth/client.ts +778 -0
- package/src/auth/http.ts +101 -0
- package/src/auth/index.ts +35 -0
- package/src/auth/react/index.tsx +351 -0
- package/src/auth/types.ts +126 -0
|
@@ -0,0 +1,623 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.SentroyAuth = void 0;
|
|
37
|
+
const http_1 = require("./http");
|
|
38
|
+
const STORAGE_KEY_PREFIX = "sentroy.auth";
|
|
39
|
+
/**
|
|
40
|
+
* Base64URL → UTF-8 decode. Browser'da `atob` + manuel UTF-8 reconstruction;
|
|
41
|
+
* Node'da `Buffer.from(..., "base64url")`. Tek kod yolu, runtime detect.
|
|
42
|
+
*/
|
|
43
|
+
function decodeBase64Url(s) {
|
|
44
|
+
// Pad + standard base64
|
|
45
|
+
const padded = s.replace(/-/g, "+").replace(/_/g, "/");
|
|
46
|
+
const pad = padded.length % 4 === 0 ? "" : "=".repeat(4 - (padded.length % 4));
|
|
47
|
+
if (typeof atob === "function") {
|
|
48
|
+
const binary = atob(padded + pad);
|
|
49
|
+
// UTF-8 reconstruction (JWT claims yabancı karakter içerebilir)
|
|
50
|
+
const bytes = new Uint8Array(binary.length);
|
|
51
|
+
for (let i = 0; i < binary.length; i++)
|
|
52
|
+
bytes[i] = binary.charCodeAt(i);
|
|
53
|
+
return new TextDecoder().decode(bytes);
|
|
54
|
+
}
|
|
55
|
+
// Node fallback
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
57
|
+
const B = globalThis.Buffer;
|
|
58
|
+
if (B)
|
|
59
|
+
return B.from(padded + pad, "base64").toString("utf8");
|
|
60
|
+
throw new Error("No base64 decoder available");
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Optional `@simplewebauthn/browser` import — RP webauthn flow kullanmak
|
|
64
|
+
* isterse kendi devDependencies'ine ekler; lazy import ile bundle'a
|
|
65
|
+
* sızmaz.
|
|
66
|
+
*/
|
|
67
|
+
async function loadSimpleWebAuthnBrowser() {
|
|
68
|
+
try {
|
|
69
|
+
// String-concat hides the specifier from TS resolver — `@simplewebauthn/browser`
|
|
70
|
+
// is an optional peer; SDK ships without it bundled. RP'nin npm install'unda
|
|
71
|
+
// varsa runtime'da çözülür, yoksa catch'e düşüp kullanıcıya net hata verir.
|
|
72
|
+
const specifier = "@simplewebauthn/" + "browser";
|
|
73
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
74
|
+
const mod = await Promise.resolve(`${specifier}`).then(s => __importStar(require(s)));
|
|
75
|
+
return {
|
|
76
|
+
startRegistration: mod.startRegistration,
|
|
77
|
+
startAuthentication: mod.startAuthentication,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
throw new Error("Passkey support requires `@simplewebauthn/browser` — install it as a peer dependency.");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function localStorageAdapter(projectSlug) {
|
|
85
|
+
if (typeof window === "undefined" || !window.localStorage) {
|
|
86
|
+
return memoryStorageAdapter();
|
|
87
|
+
}
|
|
88
|
+
const key = `${STORAGE_KEY_PREFIX}.${projectSlug}`;
|
|
89
|
+
return {
|
|
90
|
+
read() {
|
|
91
|
+
try {
|
|
92
|
+
const raw = window.localStorage.getItem(key);
|
|
93
|
+
if (!raw)
|
|
94
|
+
return null;
|
|
95
|
+
return JSON.parse(raw);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
write(value) {
|
|
102
|
+
try {
|
|
103
|
+
window.localStorage.setItem(key, JSON.stringify(value));
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// QuotaExceeded, etc — degrade to memory silently.
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
clear() {
|
|
110
|
+
try {
|
|
111
|
+
window.localStorage.removeItem(key);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// ignore
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function memoryStorageAdapter() {
|
|
120
|
+
let store = null;
|
|
121
|
+
return {
|
|
122
|
+
read: () => store,
|
|
123
|
+
write: (value) => {
|
|
124
|
+
store = value;
|
|
125
|
+
},
|
|
126
|
+
clear: () => {
|
|
127
|
+
store = null;
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
class SentroyAuth {
|
|
132
|
+
http;
|
|
133
|
+
storage;
|
|
134
|
+
listeners = new Set();
|
|
135
|
+
refreshSkew;
|
|
136
|
+
refreshTimer = null;
|
|
137
|
+
currentUser = null;
|
|
138
|
+
constructor(opts) {
|
|
139
|
+
this.http = new http_1.AuthHttp(opts);
|
|
140
|
+
this.refreshSkew = opts.refreshSkew ?? 300;
|
|
141
|
+
if (opts.storage === "memory") {
|
|
142
|
+
this.storage = memoryStorageAdapter();
|
|
143
|
+
}
|
|
144
|
+
else if (opts.storage &&
|
|
145
|
+
typeof opts.storage === "object" &&
|
|
146
|
+
"read" in opts.storage) {
|
|
147
|
+
this.storage = opts.storage;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
this.storage = localStorageAdapter(opts.projectSlug);
|
|
151
|
+
}
|
|
152
|
+
// Restore from storage on construct — `onAuthStateChanged` listener'ları
|
|
153
|
+
// henüz yok; ilk subscribe sırasında dispatch edilir.
|
|
154
|
+
const restored = this.storage.read();
|
|
155
|
+
if (restored) {
|
|
156
|
+
this.currentUser = restored.user;
|
|
157
|
+
this.scheduleRefresh(this.estimateExpiry(restored.accessToken));
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// ─── Public API ──────────────────────────────────────────────────────────
|
|
161
|
+
get user() {
|
|
162
|
+
return this.currentUser;
|
|
163
|
+
}
|
|
164
|
+
get accessToken() {
|
|
165
|
+
return this.storage.read()?.accessToken ?? null;
|
|
166
|
+
}
|
|
167
|
+
async signUp(input) {
|
|
168
|
+
const res = await this.http.request("/signup", {
|
|
169
|
+
method: "POST",
|
|
170
|
+
json: input,
|
|
171
|
+
});
|
|
172
|
+
if (res.accessToken && res.refreshToken) {
|
|
173
|
+
this.persist({
|
|
174
|
+
accessToken: res.accessToken,
|
|
175
|
+
refreshToken: res.refreshToken,
|
|
176
|
+
user: res.user,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
return res;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Sign in with email/password. MFA enrolled user'lar için response
|
|
183
|
+
* discriminated union: `kind: "mfa"` → caller `verifyMfa()` çağırır.
|
|
184
|
+
* `kind: "tokens"` → session kuruldu.
|
|
185
|
+
*/
|
|
186
|
+
async signIn(input) {
|
|
187
|
+
const res = await this.http.request("/login", { method: "POST", json: input });
|
|
188
|
+
if ("mfaRequired" in res && res.mfaRequired) {
|
|
189
|
+
return { kind: "mfa", data: res };
|
|
190
|
+
}
|
|
191
|
+
const tokens = res;
|
|
192
|
+
this.persist({
|
|
193
|
+
accessToken: tokens.accessToken,
|
|
194
|
+
refreshToken: tokens.refreshToken,
|
|
195
|
+
user: tokens.user,
|
|
196
|
+
});
|
|
197
|
+
return { kind: "tokens", data: tokens };
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* MFA verify — `signIn` ile `kind: "mfa"` döndüyse, kullanıcıdan code
|
|
201
|
+
* (veya recovery code) alıp bu method'u çağır. Başarılıysa session
|
|
202
|
+
* kurulur ve login tamamlanır.
|
|
203
|
+
*/
|
|
204
|
+
async verifyMfa(input) {
|
|
205
|
+
const res = await this.http.request("/login/mfa/verify", { method: "POST", json: input });
|
|
206
|
+
this.persist({
|
|
207
|
+
accessToken: res.accessToken,
|
|
208
|
+
refreshToken: res.refreshToken,
|
|
209
|
+
user: res.user,
|
|
210
|
+
});
|
|
211
|
+
return res;
|
|
212
|
+
}
|
|
213
|
+
async signOut() {
|
|
214
|
+
const restored = this.storage.read();
|
|
215
|
+
if (restored?.refreshToken) {
|
|
216
|
+
// Best-effort revoke — fail'ı sessizce yut (network problem
|
|
217
|
+
// sign-out'u bloklamasın).
|
|
218
|
+
await this.http
|
|
219
|
+
.request("/logout", {
|
|
220
|
+
method: "POST",
|
|
221
|
+
json: { refreshToken: restored.refreshToken },
|
|
222
|
+
})
|
|
223
|
+
.catch(() => { });
|
|
224
|
+
}
|
|
225
|
+
this.clearSession();
|
|
226
|
+
}
|
|
227
|
+
async sendPasswordReset(email) {
|
|
228
|
+
await this.http.request("/password-reset/request", {
|
|
229
|
+
method: "POST",
|
|
230
|
+
json: { email },
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Reset password using token from email. `newPassword` policy +
|
|
235
|
+
* HaveIBeenPwned breach check yapılır.
|
|
236
|
+
*/
|
|
237
|
+
async confirmPasswordReset(input) {
|
|
238
|
+
const res = await this.http.request("/password-reset/confirm", { method: "POST", json: input });
|
|
239
|
+
return res.user;
|
|
240
|
+
}
|
|
241
|
+
async verifyEmail(token) {
|
|
242
|
+
const res = await this.http.request("/verify-email", { method: "POST", json: { token } });
|
|
243
|
+
if (this.currentUser && this.currentUser.id === res.user.id) {
|
|
244
|
+
const restored = this.storage.read();
|
|
245
|
+
if (restored) {
|
|
246
|
+
this.persist({ ...restored, user: res.user });
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
this.currentUser = res.user;
|
|
250
|
+
this.notify();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return res.user;
|
|
254
|
+
}
|
|
255
|
+
// ─── Magic link ──────────────────────────────────────────────────────────
|
|
256
|
+
/**
|
|
257
|
+
* Email magic-link request. Project'in `magicLinkEnabled` true
|
|
258
|
+
* olması gerekir. Uniform 200 response — email yoksa da hata vermez.
|
|
259
|
+
*/
|
|
260
|
+
async sendMagicLink(input) {
|
|
261
|
+
await this.http.request("/magic-link/request", {
|
|
262
|
+
method: "POST",
|
|
263
|
+
json: input,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Magic link mail'inden gelen token ile login. Session kurulur.
|
|
268
|
+
*/
|
|
269
|
+
async consumeMagicLink(token) {
|
|
270
|
+
const res = await this.http.request("/magic-link/consume", { method: "POST", json: { token } });
|
|
271
|
+
this.persist({
|
|
272
|
+
accessToken: res.accessToken,
|
|
273
|
+
refreshToken: res.refreshToken,
|
|
274
|
+
user: res.user,
|
|
275
|
+
});
|
|
276
|
+
return res;
|
|
277
|
+
}
|
|
278
|
+
// ─── Invitation ──────────────────────────────────────────────────────────
|
|
279
|
+
/**
|
|
280
|
+
* Accept admin invitation. Token mail'den gelir, kullanıcı password
|
|
281
|
+
* + optional displayName girer; hesap create + session kurulur.
|
|
282
|
+
*/
|
|
283
|
+
async acceptInvitation(input) {
|
|
284
|
+
const res = await this.http.request("/invitation/accept", { method: "POST", json: input });
|
|
285
|
+
this.persist({
|
|
286
|
+
accessToken: res.accessToken,
|
|
287
|
+
refreshToken: res.refreshToken,
|
|
288
|
+
user: res.user,
|
|
289
|
+
});
|
|
290
|
+
return res;
|
|
291
|
+
}
|
|
292
|
+
// ─── Social federation ───────────────────────────────────────────────────
|
|
293
|
+
/**
|
|
294
|
+
* Provider authorize URL üret. `window.location.assign(url)` ile
|
|
295
|
+
* RP'nin sayfasından redirect — callback'te Sentroy session kurulur,
|
|
296
|
+
* redirectUri fragment'ında token'lar döner.
|
|
297
|
+
*/
|
|
298
|
+
socialAuthorizeUrl(provider, opts = {}) {
|
|
299
|
+
const params = new URLSearchParams();
|
|
300
|
+
if (opts.redirectUri)
|
|
301
|
+
params.set("redirectUri", opts.redirectUri);
|
|
302
|
+
if (opts.rememberMe)
|
|
303
|
+
params.set("rememberMe", "1");
|
|
304
|
+
const qs = params.toString();
|
|
305
|
+
return `${this.http.baseUrl}/api/v1/auth/${this.http.projectSlug}/social/${provider}/authorize${qs ? `?${qs}` : ""}`;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* `window.location.hash`tan social login redirect sonrası gelen
|
|
309
|
+
* `#access_token=...&refresh_token=...&token_type=Bearer` parse +
|
|
310
|
+
* session kur. RP sayfasına redirectUri varsayılan akış kullanıldıysa
|
|
311
|
+
* çağırın. Başarılıysa user döner, fail'da null.
|
|
312
|
+
*/
|
|
313
|
+
async consumeRedirectFragment() {
|
|
314
|
+
if (typeof window === "undefined")
|
|
315
|
+
return null;
|
|
316
|
+
const hash = window.location.hash.replace(/^#/, "");
|
|
317
|
+
if (!hash)
|
|
318
|
+
return null;
|
|
319
|
+
const params = new URLSearchParams(hash);
|
|
320
|
+
const accessToken = params.get("access_token");
|
|
321
|
+
const refreshToken = params.get("refresh_token");
|
|
322
|
+
if (!accessToken || !refreshToken)
|
|
323
|
+
return null;
|
|
324
|
+
// Fragment'ı URL'den temizle (history clean)
|
|
325
|
+
window.history.replaceState(null, "", window.location.pathname + window.location.search);
|
|
326
|
+
const user = await this.fetchMe(accessToken);
|
|
327
|
+
if (!user)
|
|
328
|
+
return null;
|
|
329
|
+
this.persist({ accessToken, refreshToken, user });
|
|
330
|
+
return user;
|
|
331
|
+
}
|
|
332
|
+
// ─── /me (current user info) ─────────────────────────────────────────────
|
|
333
|
+
async getCurrentUser() {
|
|
334
|
+
const restored = this.storage.read();
|
|
335
|
+
if (!restored)
|
|
336
|
+
return null;
|
|
337
|
+
const user = await this.fetchMe(restored.accessToken);
|
|
338
|
+
if (user) {
|
|
339
|
+
this.persist({ ...restored, user });
|
|
340
|
+
}
|
|
341
|
+
return user;
|
|
342
|
+
}
|
|
343
|
+
async fetchMe(accessToken) {
|
|
344
|
+
try {
|
|
345
|
+
return await this.http.request("/me", {
|
|
346
|
+
method: "GET",
|
|
347
|
+
bearer: accessToken,
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
catch {
|
|
351
|
+
return null;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// ─── /me/sessions ────────────────────────────────────────────────────────
|
|
355
|
+
async listSessions() {
|
|
356
|
+
return this.http.request("/me/sessions", {
|
|
357
|
+
method: "GET",
|
|
358
|
+
bearer: this.requireToken(),
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
async revokeSession(id) {
|
|
362
|
+
await this.http.request(`/me/sessions/${encodeURIComponent(id)}`, {
|
|
363
|
+
method: "DELETE",
|
|
364
|
+
bearer: this.requireToken(),
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
// ─── /me/password ────────────────────────────────────────────────────────
|
|
368
|
+
/**
|
|
369
|
+
* Change password. Backend tüm session'ları revoke eder; SDK local
|
|
370
|
+
* session'ı temizler — caller `signIn` ile tekrar oturum açar.
|
|
371
|
+
*/
|
|
372
|
+
async changePassword(input) {
|
|
373
|
+
await this.http.request("/me/password", {
|
|
374
|
+
method: "POST",
|
|
375
|
+
json: input,
|
|
376
|
+
bearer: this.requireToken(),
|
|
377
|
+
});
|
|
378
|
+
this.clearSession();
|
|
379
|
+
}
|
|
380
|
+
// ─── /me/email/change ────────────────────────────────────────────────────
|
|
381
|
+
/**
|
|
382
|
+
* Request email change — confirmation mail yeni adrese gönderilir.
|
|
383
|
+
* Kullanıcı `confirmEmailChange(token)` ile finalize eder.
|
|
384
|
+
*/
|
|
385
|
+
async requestEmailChange(input) {
|
|
386
|
+
await this.http.request("/me/email/change-request", {
|
|
387
|
+
method: "POST",
|
|
388
|
+
json: input,
|
|
389
|
+
bearer: this.requireToken(),
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
/** Token-based confirm (mail link'inden gelir). */
|
|
393
|
+
async confirmEmailChange(token) {
|
|
394
|
+
const user = await this.http.request("/me/email/change-confirm", { method: "POST", json: { token } });
|
|
395
|
+
// Email changed — tüm sessions revoke edildi, local clear
|
|
396
|
+
this.clearSession();
|
|
397
|
+
return user;
|
|
398
|
+
}
|
|
399
|
+
// ─── /me/account (delete) ────────────────────────────────────────────────
|
|
400
|
+
async requestAccountDeletion(currentPassword) {
|
|
401
|
+
await this.http.request("/me/account/delete-request", {
|
|
402
|
+
method: "POST",
|
|
403
|
+
json: { currentPassword },
|
|
404
|
+
bearer: this.requireToken(),
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
async confirmAccountDeletion(token) {
|
|
408
|
+
await this.http.request("/me/account/delete-confirm", {
|
|
409
|
+
method: "POST",
|
|
410
|
+
json: { token },
|
|
411
|
+
});
|
|
412
|
+
this.clearSession();
|
|
413
|
+
}
|
|
414
|
+
// ─── /me/activity ────────────────────────────────────────────────────────
|
|
415
|
+
async getActivity() {
|
|
416
|
+
return this.http.request("/me/activity", {
|
|
417
|
+
method: "GET",
|
|
418
|
+
bearer: this.requireToken(),
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
// ─── /me/mfa ─────────────────────────────────────────────────────────────
|
|
422
|
+
mfa = {
|
|
423
|
+
getStatus: async () => this.http.request("/me/mfa", {
|
|
424
|
+
method: "GET",
|
|
425
|
+
bearer: this.requireToken(),
|
|
426
|
+
}),
|
|
427
|
+
enrollTotp: async () => this.http.request("/me/mfa/totp/enroll", {
|
|
428
|
+
method: "POST",
|
|
429
|
+
bearer: this.requireToken(),
|
|
430
|
+
}),
|
|
431
|
+
verifyTotpEnrollment: async (code) => this.http.request("/me/mfa/totp/verify-enrollment", { method: "POST", json: { code }, bearer: this.requireToken() }),
|
|
432
|
+
disableTotp: async (currentPassword) => {
|
|
433
|
+
await this.http.request("/me/mfa/totp/disable", {
|
|
434
|
+
method: "POST",
|
|
435
|
+
json: { currentPassword },
|
|
436
|
+
bearer: this.requireToken(),
|
|
437
|
+
});
|
|
438
|
+
},
|
|
439
|
+
};
|
|
440
|
+
// ─── /me/passkey + /passkey/auth ─────────────────────────────────────────
|
|
441
|
+
passkey = {
|
|
442
|
+
list: async () => this.http.request("/me/passkey", {
|
|
443
|
+
method: "GET",
|
|
444
|
+
bearer: this.requireToken(),
|
|
445
|
+
}),
|
|
446
|
+
delete: async (id) => {
|
|
447
|
+
await this.http.request(`/me/passkey/${encodeURIComponent(id)}`, {
|
|
448
|
+
method: "DELETE",
|
|
449
|
+
bearer: this.requireToken(),
|
|
450
|
+
});
|
|
451
|
+
},
|
|
452
|
+
/**
|
|
453
|
+
* Register a new passkey on this device.
|
|
454
|
+
*
|
|
455
|
+
* Browser-only: dynamically imports `@simplewebauthn/browser`. RP
|
|
456
|
+
* SDK kullanıyor ama webauthn/browser bağımlılığı yoksa caller
|
|
457
|
+
* `peerDependencies` aracılığıyla manuel ekler.
|
|
458
|
+
*/
|
|
459
|
+
register: async (deviceName) => {
|
|
460
|
+
const begin = await this.http.request("/me/passkey/register/begin", {
|
|
461
|
+
method: "POST",
|
|
462
|
+
bearer: this.requireToken(),
|
|
463
|
+
});
|
|
464
|
+
const sw = await loadSimpleWebAuthnBrowser();
|
|
465
|
+
const attestation = await sw.startRegistration({
|
|
466
|
+
optionsJSON: begin.options,
|
|
467
|
+
});
|
|
468
|
+
await this.http.request("/me/passkey/register/complete", {
|
|
469
|
+
method: "POST",
|
|
470
|
+
json: {
|
|
471
|
+
challengeToken: begin.challengeToken,
|
|
472
|
+
response: attestation,
|
|
473
|
+
deviceName: deviceName ??
|
|
474
|
+
(typeof navigator !== "undefined"
|
|
475
|
+
? navigator.userAgent.slice(0, 80)
|
|
476
|
+
: null),
|
|
477
|
+
},
|
|
478
|
+
bearer: this.requireToken(),
|
|
479
|
+
});
|
|
480
|
+
},
|
|
481
|
+
/**
|
|
482
|
+
* Sign in with passkey. Email opsiyonel — verilirse server o
|
|
483
|
+
* user'ın passkey'lerini allowList yapar, yoksa "usernameless".
|
|
484
|
+
* Session kurulur.
|
|
485
|
+
*/
|
|
486
|
+
authenticate: async (opts = {}) => {
|
|
487
|
+
const begin = await this.http.request("/passkey/authenticate/begin", {
|
|
488
|
+
method: "POST",
|
|
489
|
+
json: { email: opts.email },
|
|
490
|
+
});
|
|
491
|
+
const sw = await loadSimpleWebAuthnBrowser();
|
|
492
|
+
const assertion = await sw.startAuthentication({
|
|
493
|
+
optionsJSON: begin.options,
|
|
494
|
+
});
|
|
495
|
+
const res = await this.http.request("/passkey/authenticate/complete", {
|
|
496
|
+
method: "POST",
|
|
497
|
+
json: {
|
|
498
|
+
challengeToken: begin.challengeToken,
|
|
499
|
+
response: assertion,
|
|
500
|
+
rememberMe: opts.rememberMe,
|
|
501
|
+
},
|
|
502
|
+
});
|
|
503
|
+
this.persist({
|
|
504
|
+
accessToken: res.accessToken,
|
|
505
|
+
refreshToken: res.refreshToken,
|
|
506
|
+
user: res.user,
|
|
507
|
+
});
|
|
508
|
+
return res;
|
|
509
|
+
},
|
|
510
|
+
};
|
|
511
|
+
/**
|
|
512
|
+
* Force refresh now — caller'ın sürdüğü access token süresi dolmuş
|
|
513
|
+
* olabilir; bu method yeni token'ları persist eder.
|
|
514
|
+
*/
|
|
515
|
+
async refreshNow() {
|
|
516
|
+
await this.refresh();
|
|
517
|
+
}
|
|
518
|
+
/** Manual session injection — fragment / cookie redirect dışında tokens
|
|
519
|
+
* başka bir kanaldan elde edildiyse (örn. RP custom auth callback). */
|
|
520
|
+
setSession(input) {
|
|
521
|
+
this.persist(input);
|
|
522
|
+
}
|
|
523
|
+
requireToken() {
|
|
524
|
+
const restored = this.storage.read();
|
|
525
|
+
if (!restored?.accessToken) {
|
|
526
|
+
throw new Error("Not signed in — accessToken missing.");
|
|
527
|
+
}
|
|
528
|
+
return restored.accessToken;
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* Subscription pattern — Firebase Auth uyumlu. Caller'ın hemen mevcut
|
|
532
|
+
* state'i alabilmesi için constructor'da restore edilen user
|
|
533
|
+
* subscribe sırasında bir kez dispatch edilir.
|
|
534
|
+
*/
|
|
535
|
+
onAuthStateChanged(listener) {
|
|
536
|
+
this.listeners.add(listener);
|
|
537
|
+
// Microtask gibi async dispatch — caller's `useEffect` cleanup race
|
|
538
|
+
// problemlerini önler.
|
|
539
|
+
Promise.resolve().then(() => listener(this.currentUser));
|
|
540
|
+
return () => {
|
|
541
|
+
this.listeners.delete(listener);
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
// ─── Internals ───────────────────────────────────────────────────────────
|
|
545
|
+
persist(value) {
|
|
546
|
+
this.storage.write(value);
|
|
547
|
+
this.currentUser = value.user;
|
|
548
|
+
this.notify();
|
|
549
|
+
this.scheduleRefresh(this.estimateExpiry(value.accessToken));
|
|
550
|
+
}
|
|
551
|
+
clearSession() {
|
|
552
|
+
this.storage.clear();
|
|
553
|
+
this.currentUser = null;
|
|
554
|
+
if (this.refreshTimer) {
|
|
555
|
+
clearTimeout(this.refreshTimer);
|
|
556
|
+
this.refreshTimer = null;
|
|
557
|
+
}
|
|
558
|
+
this.notify();
|
|
559
|
+
}
|
|
560
|
+
notify() {
|
|
561
|
+
for (const l of this.listeners) {
|
|
562
|
+
try {
|
|
563
|
+
l(this.currentUser);
|
|
564
|
+
}
|
|
565
|
+
catch {
|
|
566
|
+
// Listener hatası diğer subscriber'ları engellemesin.
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
/**
|
|
571
|
+
* JWT'nin `exp` claim'inden expiry'i tahmin et. Parsing fail ise
|
|
572
|
+
* 1 saat varsay (default access TTL). Refresh window: exp - skew.
|
|
573
|
+
*
|
|
574
|
+
* **Browser-safe**: `Buffer` Node'a özel, tarayıcıda yok. `atob`
|
|
575
|
+
* + URL-safe charset normalization ile decode ediyoruz.
|
|
576
|
+
*/
|
|
577
|
+
estimateExpiry(accessToken) {
|
|
578
|
+
try {
|
|
579
|
+
const [, payloadB64] = accessToken.split(".");
|
|
580
|
+
const payload = JSON.parse(decodeBase64Url(payloadB64));
|
|
581
|
+
if (typeof payload.exp === "number") {
|
|
582
|
+
return payload.exp * 1000;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
catch {
|
|
586
|
+
// ignore — fall through to default
|
|
587
|
+
}
|
|
588
|
+
return Date.now() + 60 * 60 * 1000;
|
|
589
|
+
}
|
|
590
|
+
scheduleRefresh(expiryMs) {
|
|
591
|
+
if (typeof window === "undefined")
|
|
592
|
+
return; // SSR'da auto-refresh yok
|
|
593
|
+
if (this.refreshTimer)
|
|
594
|
+
clearTimeout(this.refreshTimer);
|
|
595
|
+
const fireAt = expiryMs - this.refreshSkew * 1000;
|
|
596
|
+
const delay = Math.max(fireAt - Date.now(), 5_000);
|
|
597
|
+
this.refreshTimer = setTimeout(() => {
|
|
598
|
+
this.refresh().catch(() => {
|
|
599
|
+
// Refresh fail → session cleared, listener'lar null user görür
|
|
600
|
+
this.clearSession();
|
|
601
|
+
});
|
|
602
|
+
}, delay);
|
|
603
|
+
}
|
|
604
|
+
async refresh() {
|
|
605
|
+
const restored = this.storage.read();
|
|
606
|
+
if (!restored?.refreshToken) {
|
|
607
|
+
this.clearSession();
|
|
608
|
+
return;
|
|
609
|
+
}
|
|
610
|
+
const res = await this.http.request("/refresh", {
|
|
611
|
+
method: "POST",
|
|
612
|
+
json: { refreshToken: restored.refreshToken },
|
|
613
|
+
});
|
|
614
|
+
this.storage.write({
|
|
615
|
+
...restored,
|
|
616
|
+
accessToken: res.accessToken,
|
|
617
|
+
refreshToken: res.refreshToken,
|
|
618
|
+
});
|
|
619
|
+
this.scheduleRefresh(this.estimateExpiry(res.accessToken));
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
exports.SentroyAuth = SentroyAuth;
|
|
623
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/auth/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface AuthHttpOptions {
|
|
2
|
+
authBaseUrl?: string;
|
|
3
|
+
projectSlug: string;
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
/** Hata-fırlatma yerine raw response döndür — caller fine-grained handling. */
|
|
6
|
+
rawErrors?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare class AuthHttp {
|
|
9
|
+
readonly baseUrl: string;
|
|
10
|
+
readonly projectSlug: string;
|
|
11
|
+
readonly apiKey?: string;
|
|
12
|
+
constructor(opts: AuthHttpOptions);
|
|
13
|
+
url(path: string): string;
|
|
14
|
+
request<T>(path: string, init?: RequestInit & {
|
|
15
|
+
json?: unknown;
|
|
16
|
+
bearer?: string;
|
|
17
|
+
}): Promise<T>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/auth/http.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+EAA+E;IAC/E,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,qBAAa,QAAQ;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;gBAEZ,IAAI,EAAE,eAAe;IASjC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKnB,OAAO,CAAC,CAAC,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,WAAW,GAAG;QAClB,IAAI,CAAC,EAAE,OAAO,CAAA;QACd,MAAM,CAAC,EAAE,MAAM,CAAA;KACX,GACL,OAAO,CAAC,CAAC,CAAC;CAsDd"}
|