SDK Web
Abrova Auth برای مرورگر (@abrova/auth-web). ورود ناشناس، Apple، Google، ایمیل و رمز عبور، لینک یکبارمصرف و تلگرام فقط با کلید عمومی؛ access token در حافظه، ذخیرهسازی اختیاری، و token provider برای همهی SDKهای ابرووا.
فقط از کلید API عمومی استفاده میکند. قرار دادنش در bundle مرورگر امن است
TypeScript ساده: React، Vue، Svelte، کد سمت کلاینت Next.js، یا بدون فریمورک
تا خودتان نخواهید چیزی ذخیره نمیشود
tokenProvider و getToken() برای SDKهای دیگر ابرووا
createNonce() برای Apple JS و Google Identity Services
linkApple، linkGoogle و linkPassword شناسهی کاربر را حفظ میکنند
این صفحه @abrova/auth-web نسخهی 0.1.1 را توضیح میدهد.
مرورگری با fetch و crypto.getRandomValues (همهی مرورگرهای فعلی). فقط در کد سمت کلاینت اجرا میشود؛ Abrova Auth SDK سرور ندارد.
از دستیار هوش مصنوعی استفاده میکنید؟ این صفحه را با Copy page for AI به آن بدهید، یا همهی مستندات را بهصورت متن ساده از /docs/llms.txt بگیرید. دستیارهای هوش مصنوعی را ببینید.
نصب#
پکیج از Abrova Center میآید. اول در .npmrc پروژه، scope @abrova را به رجیستری ابرووا ارجاع دهید:
@abrova:registry=https://center.abrova.ir/api/packages/abrova/npm/
سپس نصب کنید:
npm install @abrova/auth-web
یا در package.json:
{
"dependencies": {
"@abrova/auth-web": "^0.1.1"
}
}در کنسول ابرووا، Abrova Auth را برای پروژه (تنظیمات › محصولات) و روشهای ورود دلخواه را (Abrova Auth › روشهای ورود) روشن کنید.
مقداردهی اولیه#
برای اپ یک کلاینت با کلید API عمومی (ab_live_...) بسازید:
import { createAbrovaAuth } from '@abrova/auth-web';
export const auth = createAbrovaAuth({ apiKey: 'ab_live_your_api_key' });
auth.onAuthStateChanged((userId) => {
console.log(userId ? `signed in as ${userId}` : 'signed out');
});| گزینه | پیشفرض | توضیح |
|---|---|---|
| apiKey | - | کلید API عمومی شما (ab_live_...). هرگز کلید سرور نه. |
| storage | memory | جایی که refresh token بین بارگذاریهای صفحه نگه داشته میشود. «وارد ماندن» را ببینید. |
| storageKey | برگرفته از کلید API | کلید ذخیرهسازی، تا دو پروژه هرگز یک نشست مشترک نداشته باشند. |
| timeoutMs | 15000 | مهلت درخواست به میلیثانیه. |
await auth.ready() وقتی نشست ذخیرهشده (اگر باشد) بارگذاری شد resolve میشود. onAuthStateChanged در همان لحظه listener شما را با شناسهی کاربر فعلی صدا میزند، و دوباره در هر ورود یا خروج. یک تابع برمیگرداند که گوش دادن را متوقف میکند.
ورود#
const { methods } = await auth.getMethods(); // e.g. ['anonymous', 'google', 'password']
await auth.ready();
if (!auth.isSignedIn && methods.includes('anonymous')) {
await auth.signInAnonymously();
}
console.log(auth.currentUserId); // ru_...فقط دکمههای روشهایی را نشان دهید که getMethods() برمیگرداند.
استفاده از کاربر با SDKهای دیگر ابرووا#
setUserId(auth.currentUserId)) به تریس وصل کنید.import { AbrovaSync } from '@abrova/sync-web';
// Sync, Push and A/B Testing: null while signed out
const sync = new AbrovaSync({ apiKey: 'ab_live_your_api_key', tokenProvider: () => auth.getToken() });auth.getToken() به یک access token تازه resolve میشود، یا وقتی کسی وارد نشده به null. auth.tokenProvider به توکن resolve میشود و وقتی کسی وارد نشده با UNAUTHENTICATED reject میشود: از آن برای Abrova Chat استفاده کنید که provider آن باید توکن برگرداند. بعد از ورود یا خروج، متد refresh آن SDK را صدا بزنید (مثلاً sync.refreshUserToken()). بیشتر: استفاده با محصولات دیگر ابرووا.
روشهای ورود#
هر روش صفحهی خودش را با راهاندازی کنسول دارد: ناشناس، Apple، Google، ایمیل و رمز عبور، لینک یکبارمصرف، تلگرام.
ایمیل و رمز عبور
const result = await auth.signUpWithEmail({ email, password, redirectUrl: 'https://example.com/auth/verify' });
// result.signedIn is false when the project requires a verified e-mail first.
await auth.signInWithEmail({ email, password });
await auth.sendPasswordReset({ email, redirectUrl: 'https://example.com/auth/reset' });
await auth.resetPassword({ token, password }); // token from the link's ?token=
await auth.verifyEmail({ token });
await auth.sendEmailVerification({ redirectUrl: 'https://example.com/auth/verify' });لینک یکبارمصرف
await auth.sendMagicLink({ email, redirectUrl: 'https://example.com/auth/magic' });
// On the page the link opens:
const token = new URL(location.href).searchParams.get('token');
if (token) await auth.signInWithMagicLink({ token });تلگرام
const { sent, botUrl } = await auth.requestTelegramCode({ phone: '+989121234567' });
if (!sent && botUrl) window.open(botUrl); // the user starts the bot and shares the number
await auth.verifyTelegramCode({ phone: '+989121234567', code: '123456' });Apple و Google
ورودِ خودِ ارائهدهنده را با nonceای از SDK اجرا کنید، سپس ID token آن را به ابرووا بدهید:
const { rawNonce, hashedNonce } = await auth.createNonce();
// Give hashedNonce to Google Identity Services or Sign in with Apple JS as the `nonce`.
await auth.signInWithGoogle({ idToken, rawNonce });
await auth.signInWithApple({ idToken, rawNonce, authorizationCode, name });برای هر ورود یک nonce جدید بسازید. ورود با Google به اتصال به Google نیاز دارد که بعضی کاربران در ایران ندارند. ناشناس، ایمیل و رمز عبور، لینک یکبارمصرف و کد تلگرام بدون Google کار میکنند، پس دستکم یکی از آنها را هم ارائه کنید. ورود با Google را ببینید. روی وب، Apple از Services ID شما استفاده میکند: آن را در Abrova Auth › روشهای ورود › Apple اضافه کنید.
ارتقای کاربر ناشناس#
وصل کردن شناسهی کاربر را حفظ میکند، پس دادههای کاربر مال خودش میماند:
import { isAbrovaAuthError } from '@abrova/auth-web';
try {
await auth.linkGoogle({ idToken, rawNonce }); // or linkApple(...), linkPassword({ email, password })
} catch (e) {
if (isAbrovaAuthError(e) && e.code === 'PROVIDER_ALREADY_LINKED') {
// This Google account already belongs to another user.
}
}کاربر فعلی#
auth.currentUserId; // null when signed out
auth.isSignedIn;
const me = await auth.getMe(); // { id, anonymous, emailVerified, createdAt, providers }
auth.currentUser; // the user last loaded by getMe()خروج و حذف حساب#
await auth.signOut(); // this device await auth.signOutEverywhere(); // every device await auth.deleteAccount(); // deletes the user, then signs out
وارد ماندن#
بهطور پیشفرض چیزی ذخیره نمیشود: کاربر بعد از reload صفحه دوباره وارد میشود. برای نگه داشتن نشست، localStorage را فعال کنید:
import { createAbrovaAuth, localStorageStorage } from '@abrova/auth-web';
const auth = createAbrovaAuth({ apiKey: 'ab_live_your_api_key', storage: localStorageStorage() });هر اسکریپتی در صفحهی شما میتواند localStorage را بخواند. یک باگ XSS یا یک وابستگی آلوده میتواند refresh token و همراه آن نشست کاربر را بردارد. از این گزینه فقط با یک Content Security Policy سختگیرانه و بدون اسکریپتهای نامطمئن استفاده کنید. SDK هرگز cookie تنظیم نمیکند.
میتوانید حافظهی دلخواه خودتان را هم بدهید: شیئی با متدهای async به نام get، set و remove.
مدیریت خطاها#
هر شکست یک AbrovaAuthError با یک code است:
import { isAbrovaAuthError } from '@abrova/auth-web';
try {
await auth.signInWithEmail({ email, password });
} catch (e) {
if (isAbrovaAuthError(e) && e.code === 'INVALID_CREDENTIALS') showError('Wrong e-mail or password');
if (isAbrovaAuthError(e) && e.code === 'RATE_LIMITED') retryIn(e.retryAfterSec);
}SDK علاوه بر کدهای سرور از NETWORK_ERROR استفاده میکند. خطای شبکه هرگز کاربر را خارج نمیکند؛ نشستِ لغوشده یا منقضی این کار را میکند (onAuthStateChanged(null)). access token ۲ دقیقه پیش از انقضا تمدید میشود و فراخوانیهای همزمان در یک تمدید شریک میشوند. همهی کدها: کدهای خطا.
عیبیابی#
خروج بعد از هر reload
این رفتار پیشفرض است: نشست در حافظه نگه داشته میشود. اگر صفحهتان Content Security Policy سختگیرانه دارد، storage: localStorageStorage() را بدهید، یا دوباره بهصورت ناشناس وارد شوید.
مقدار currentUserId درست بعد از reload برابر null است
نشست ذخیرهشده بهصورت async بارگذاری میشود. منتظر auth.ready() یا اولین فراخوانی onAuthStateChanged بمانید.
لینک ایمیلی با INVALID_INPUT رد میشود
redirectUrl باید با یکی از آدرسهای لینک در Abrova Auth › تنظیمات شروع شود.