SDK React Native
Abrova Auth برای React Native و Expo (@abrova/auth-react-native). ورود ناشناس، Apple، Google، ایمیل و رمز عبور، لینک یکبارمصرف و تلگرام فقط با کلید عمومی؛ refresh token در Keychain یا Keystore از طریق react-native-keychain یا expo-secure-store؛ token provider برای همهی SDKهای ابرووا.
فقط از کلید API عمومی استفاده میکند. قرار دادنش در اپ امن است
react-native-keychain یا expo-secure-store برای نشست
refresh token فقط روی همین دستگاه؛ access token در حافظه
tokenProvider و getToken() برای SDKهای دیگر ابرووا
یک مجموعه فراخوانی برای کد وب و موبایل
linkApple، linkGoogle و linkPassword شناسهی کاربر را حفظ میکنند
این صفحه @abrova/auth-react-native نسخهی 0.1.1 را توضیح میدهد.
React Native با react-native-keychain، یا Expo با expo-secure-store. ورود با Apple و Google به crypto.getRandomValues (react-native-get-random-values) هم نیاز دارد.
از دستیار هوش مصنوعی استفاده میکنید؟ این صفحه را با 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-react-native react-native-keychain # or, with Expo npx expo install @abrova/auth-react-native expo-secure-store
یا در package.json:
{
"dependencies": {
"@abrova/auth-react-native": "^0.1.1"
}
}برای nonce ورود با Apple و Google، react-native-get-random-values را هم نصب کنید و آن را در ابتدای index.js import کنید:
npm install react-native-get-random-values
// index.js, before anything else import 'react-native-get-random-values';
در کنسول ابرووا، Abrova Auth را برای پروژه (تنظیمات › محصولات) و روشهای ورود دلخواه را (Abrova Auth › روشهای ورود) روشن کنید.
مقداردهی اولیه#
برای اپ یک کلاینت با کلید API عمومی (ab_live_...) و حافظهی امن بسازید:
import * as Keychain from 'react-native-keychain';
import { createAbrovaAuth, keychainStorage } from '@abrova/auth-react-native';
export const auth = createAbrovaAuth({
apiKey: 'ab_live_your_api_key',
storage: keychainStorage(Keychain),
});
auth.onAuthStateChanged((userId) => {
console.log(userId ? `signed in as ${userId}` : 'signed out');
});با Expo:
import * as SecureStore from 'expo-secure-store';
import { createAbrovaAuth, secureStoreStorage } from '@abrova/auth-react-native';
export const auth = createAbrovaAuth({ apiKey: 'ab_live_your_api_key', storage: secureStoreStorage(SecureStore) });فقط refresh token ذخیره میشود (Keychain در iOS، حافظهی متکی به Keystore در Android، فقط روی همین دستگاه). access token در حافظه میماند. بدون storage، هیچ چیز بعد از راهاندازی دوبارهی اپ باقی نمیماند.
await auth.ready() وقتی نشست ذخیرهشده بارگذاری شد resolve میشود. onAuthStateChanged در همان لحظه listener شما را با شناسهی کاربر فعلی صدا میزند، و دوباره در هر ورود یا خروج.
ورود#
const { methods } = await auth.getMethods(); // e.g. ['anonymous', 'apple', 'google']
await auth.ready();
if (!auth.isSignedIn && methods.includes('anonymous')) {
await auth.signInAnonymously();
}
console.log(auth.currentUserId); // ru_...استفاده از کاربر با SDKهای دیگر ابرووا#
import AbrovaSync from '@abrova/sync-react-native';
// Sync, Push and A/B Testing: null while signed out
await AbrovaSync.init({ apiKey: 'ab_live_your_api_key', tokenProvider: () => auth.getToken() });auth.getToken() به یک access token تازه resolve میشود، یا وقتی کسی وارد نشده به null. auth.tokenProvider به جای آن با UNAUTHENTICATED reject میشود: از آن برای Abrova Chat استفاده کنید. وقتی کاربر وارد یا خارج میشود، از SDKهای دیگر بخواهید توکن جدید بگیرند (مثلاً AbrovaSync.refreshUserToken()). بیشتر: استفاده با محصولات دیگر ابرووا.
روشهای ورود#
هر روش صفحهی خودش را با راهاندازی کنسول دارد: ناشناس، Apple، Google، ایمیل و رمز عبور، لینک یکبارمصرف، تلگرام.
ایمیل و رمز عبور
const result = await auth.signUpWithEmail({ email, password, redirectUrl: 'myapp://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: 'myapp://auth/reset' });
await auth.resetPassword({ token, password }); // token from the link's ?token=
await auth.verifyEmail({ token });لینک یکبارمصرف
await auth.sendMagicLink({ email, redirectUrl: 'myapp://auth/magic' });
// When the app is opened with the link (Linking):
const token = new URL(url).searchParams.get('token');
if (token) await auth.signInWithMagicLink({ token });تلگرام
import { Linking } from 'react-native';
const { sent, botUrl } = await auth.requestTelegramCode({ phone: '+989121234567' });
if (!sent && botUrl) await Linking.openURL(botUrl);
await auth.verifyTelegramCode({ phone: '+989121234567', code: '123456' });Apple و Google
ورود بومی را با nonceای از SDK اجرا کنید، سپس ID token آن را به ابرووا بدهید:
const { rawNonce, hashedNonce } = await auth.createNonce();
// Give hashedNonce to your Apple / Google sign-in library as the `nonce`.
await auth.signInWithApple({ idToken, rawNonce, authorizationCode });
await auth.signInWithGoogle({ idToken, rawNonce });برای هر ورود یک nonce جدید بسازید. ورود با Google به اتصال به Google، و در Android به Google Play services هم، نیاز دارد؛ بعضی کاربران در ایران هیچکدام را ندارند. ناشناس، ایمیل و رمز عبور، لینک یکبارمصرف و کد تلگرام بدون Google کار میکنند، پس دستکم یکی از آنها را هم ارائه کنید. ورود با Google را ببینید.
ارتقای کاربر ناشناس#
وصل کردن شناسهی کاربر را حفظ میکند، پس دادههای کاربر مال خودش میماند:
import { isAbrovaAuthError } from '@abrova/auth-react-native';
try {
await auth.linkApple({ idToken, rawNonce }); // or linkGoogle(...), linkPassword({ email, password })
} catch (e) {
if (isAbrovaAuthError(e) && e.code === 'PROVIDER_ALREADY_LINKED') {
// This Apple ID 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 (required by the App Store)
مدیریت خطاها#
هر شکست یک AbrovaAuthError با یک code است:
import { isAbrovaAuthError } from '@abrova/auth-react-native';
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 ۲ دقیقه پیش از انقضا تمدید میشود و فراخوانیهای همزمان در یک تمدید شریک میشوند. همهی کدها: کدهای خطا.
عیبیابی#
خروج بعد از هر بار راهاندازی دوباره
storage: keychainStorage(Keychain) یا secureStoreStorage(SecureStore) را بدهید. بدون آن، نشست فقط در حافظه نگه داشته میشود.
createNonce با NOT_CONFIGURED شکست میخورد
crypto.getRandomValues وجود ندارد. react-native-get-random-values را نصب کنید و آن را در ابتدای index.js import کنید.
لینک ایمیلی با INVALID_INPUT رد میشود
redirectUrl باید با یکی از آدرسهای لینک در Abrova Auth › تنظیمات شروع شود، مثلاً myapp://auth.