ابرووا
شروع رایگان
☰ فهرست مستندات · SDK فلاتر

SDK Flutter

Abrova Auth برای Flutter (abrova_auth). ورود ناشناس، Apple، Google، ایمیل و رمز عبور، لینک یک‌بارمصرف و تلگرام فقط با کلید عمومی؛ نشست در حافظه‌ی امن نگه داشته می‌شود و توکن کاربر در همه‌ی SDKهای ابرووا کار می‌کند.

Flutter 0.1.1Flutter 3.13+Dart 3.0+به‌روزرسانی: ۵ آبان ۱۴۰۵
امن برای کلاینت

فقط از کلید API عمومی استفاده می‌کند. قرار دادنش در اپ امن است

بازیابی هنگام شروع

initialize() نشست ذخیره‌شده را بدون درخواست شبکه بارگذاری می‌کند

حافظه‌ی امن

refresh token در Keychain / حافظه‌ی متکی به Keystore

token provider

tokenProvider و chatTokenProvider برای SDKهای دیگر ابرووا

همه‌ی روش‌ها

ناشناس، Apple، Google، ایمیل، لینک یک‌بارمصرف، تلگرام

ارتقای مهمان‌ها

linkApple، linkGoogle و linkPassword شناسه‌ی کاربر را حفظ می‌کنند

SDK Flutter برای Abrova Auth نسخه‌ی v0.1.1.

این صفحه abrova_auth نسخه‌ی 0.1.1 را توضیح می‌دهد.

پیش‌نیازها.

Flutter 3.13 یا بالاتر. Dart 3.0 یا بالاتر. برای نشست از flutter_secure_storage استفاده می‌کند.

از دستیار هوش مصنوعی استفاده می‌کنید؟ این صفحه را با Copy page for AI به آن بدهید، یا همه‌ی مستندات را به‌صورت متن ساده از /docs/llms.txt بگیرید. دستیارهای هوش مصنوعی را ببینید.

نصب#

پکیج‌ها از Abrova Center می‌آیند، پس محدودیت‌های دسترسی به pub.dev مشکلی ایجاد نمی‌کند. پکیج را با رجیستری ابرووا به‌عنوان منبع hosted در pubspec.yaml اضافه کنید:

pubspec.yamlYAML
dependencies:
abrova_auth:
  hosted: https://center.abrova.ir/api/packages/abrova/pub
  version: ^0.1.1

سپس نصبش کنید:

bash
flutter pub get

در کنسول ابرووا، Abrova Auth را برای پروژه (تنظیمات › محصولات) و روش‌های ورود دلخواه را (Abrova Auth › روش‌های ورود) روشن کنید.

مقداردهی اولیه#

AbrovaAuth.initialize را یک بار، پیش از runApp، با کلید API عمومی (ab_live_...) صدا بزنید. این تابع نشست ذخیره‌شده روی دستگاه را بدون درخواست شبکه بازیابی می‌کند، پس currentUser بلافاصله آماده است.

dart
import 'package:flutter/material.dart';
import 'package:abrova_auth/abrova_auth.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await AbrovaAuth.initialize('ab_live_your_api_key');
  runApp(const MyApp());
}

سپس هر جا خواستید از AbrovaAuth.instance استفاده کنید.

گزینهپیش‌فرضتوضیح
apiKey-کلید API عمومی شما (ab_live_...). هرگز کلید سرور نه.
timeout۱۵ ثانیهمهلت درخواست.
refreshMargin۲ دقیقهوقتی کمتر از این مقدار از اعتبار access token مانده، تمدیدش کن.
storageSecureAbrovaAuthStorage()محل نگه‌داری نشست. MemoryAbrovaAuthStorage چیزی نگه نمی‌دارد (برای تست).

ورود#

فقط روش‌هایی را نشان دهید که پروژه‌تان روشن کرده، و فقط وقتی کسی هنوز وارد نشده ورود را انجام دهید:

dart
final auth = AbrovaAuth.instance;

final methods = await auth.getMethods();
// methods.anonymous, methods.apple, methods.google, methods.password, methods.magicLink, methods.telegram

if (auth.currentUser == null && methods.anonymous) {
  await auth.signInAnonymously();
}
print(auth.currentUser!.id); // ru_...

اگر از قبل یک کاربر ناشناس روی این دستگاه وارد شده باشد، signInAnonymously() همان کاربر فعلی را برمی‌گرداند.

استفاده از کاربر با SDKهای دیگر ابرووا#

به‌زودی. Abrova Sync، Chat، Push، Storage و A/B Testing به‌زودی می‌آیند. فراخوانی‌های زیر نشان می‌دهند کاربر Auth را چطور خواهند گرفت؛ امروز کاربر را با AbrovaTrace.setUserId(auth.currentUser!.id) به ابرووا تریس وصل کنید.

token provider را بدهید. SDK دیگر هر وقت به توکن نیاز داشت آن را از provider می‌خواهد؛ Abrova Auth توکن را پیش از انقضا تمدید می‌کند و درخواست‌کننده‌های هم‌زمان در یک تمدید شریک می‌شوند.

dart
await AbrovaSync.init(AbrovaSyncConfig(
  apiKey: 'ab_live_your_api_key',
  tokenProvider: AbrovaAuth.instance.tokenProvider, // null while signed out
));

Abrova Chat، AbrovaAuth.instance.chatTokenProvider را می‌گیرد (به جای برگرداندن null خطا می‌دهد) و currentUser.id را به‌عنوان شناسه‌ی کاربر. بعد از ورود یا خروج، متد refresh آن SDK را صدا بزنید، مثلاً AbrovaSync.refreshUserToken(). استفاده با محصولات دیگر ابرووا را ببینید.

روش‌های ورود#

هر روش صفحه‌ی خودش را با راه‌اندازی کنسول دارد: ناشناس، Apple، Google، ایمیل و رمز عبور، لینک یک‌بارمصرف، تلگرام.

ایمیل و رمز عبور

dart
final result = await auth.signUpWithEmail(
  email: email,
  password: password,
  redirectUrl: 'https://example.com/auth/verify', // optional: sends a verification e-mail
);
// result.signedIn is false when the project requires a verified e-mail first.

await auth.signInWithEmail(email: email, password: password);

await auth.sendPasswordReset(email, redirectUrl: 'https://example.com/auth/reset');
await auth.resetPassword(tokenFromLink, newPassword); // ends every session; does not sign in
await auth.verifyEmail(tokenFromLink);
await auth.sendEmailVerification(redirectUrl: 'https://example.com/auth/verify');

لینک‌ها redirectUrl شما را با ?token=... باز می‌کنند. این آدرس باید با یکی از آدرس‌های لینک در Abrova Auth › تنظیمات شروع شود.

لینک یک‌بارمصرف

dart
await auth.sendMagicLink(email, redirectUrl: 'myapp://auth/magic');
// When the app is opened with the link:
await auth.signInWithMagicLink(Uri.parse(link).queryParameters['token']!);

تلگرام

dart
final r = await auth.requestTelegramCode('+989121234567');
if (!r.sent && r.botUrl != null) {
  // First time: open r.botUrl so the user starts the bot and shares the number.
}
await auth.verifyTelegramCode('+989121234567', code);

Apple و Google

پلاگین بومی ارائه‌دهنده را با nonce هش‌شده اجرا کنید و nonce خام را به ابرووا بدهید:

dart
final raw = AbrovaAuthNonce.generate();

// sign_in_with_apple
final apple = await SignInWithApple.getAppleIDCredential(
  scopes: [AppleIDAuthorizationScopes.email, AppleIDAuthorizationScopes.fullName],
  nonce: AbrovaAuthNonce.sha256Hex(raw),
);
await auth.signInWithApple(
  idToken: apple.identityToken!,
  rawNonce: raw,
  authorizationCode: apple.authorizationCode, // lets account deletion revoke the Apple sign-in
  name: [apple.givenName, apple.familyName].whereType<String>().join(' '),
);

// google_sign_in 7 — use a new nonce for each sign-in
final rawG = AbrovaAuthNonce.generate();
await GoogleSignIn.instance.initialize(
  serverClientId: 'xxx.apps.googleusercontent.com',
  nonce: AbrovaAuthNonce.sha256Hex(rawG),
);
final account = await GoogleSignIn.instance.authenticate();
await auth.signInWithGoogle(idToken: account.authentication.idToken!, rawNonce: rawG);

اول bundle IDها و Google client IDهایتان را در کنسول اضافه کنید. هر nonce فقط یک بار کار می‌کند.

ورود با Google به اتصال به Google، و در Android به Google Play services هم، نیاز دارد؛ بعضی کاربران در ایران هیچ‌کدام را ندارند. ناشناس، ایمیل و رمز عبور، لینک یک‌بارمصرف و کد تلگرام بدون Google کار می‌کنند، پس دست‌کم یکی از آن‌ها را هم ارائه کنید. ورود با Google را ببینید.

ارتقای کاربر ناشناس#

وصل کردن شناسه‌ی کاربر را حفظ می‌کند، پس داده‌های کاربر مال خودش می‌ماند:

dart
try {
  await auth.linkGoogle(idToken: idToken, rawNonce: raw);
  // or linkApple(...), linkPassword(email: ..., password: ...)
} on AbrovaProviderAlreadyLinkedException {
  // This Google account already has a user: offer to sign in with it instead.
}

کاربران ناشناس و ارتقا را ببینید.

کاربر فعلی#

dart
auth.currentUser;          // AbrovaAuthUser? — null when signed out
auth.isSignedIn;

auth.authStateChanges.listen((user) {
  // Emits the current user first, then on every sign-in, sign-out and profile change.
});

final me = await auth.getMe(); // fresh from the server
final token = await auth.getToken(); // the access token, if you call your own API with it
فیلدنوعتوضیح
idStringشناسه‌ی کاربر (ru_...)
anonymousboolتا وقتی روشی وصل نشده true است
emailVerifiedboolوقتی ایمیل ثابت شده باشد true است
createdAtDateTime?زمان ساخت کاربر
providersList<String>روش‌های وصل‌شده، مثلاً apple، password

خروج و حذف حساب#

dart
await auth.signOut();           // this device; never fails
await auth.signOutEverywhere(); // every device
await auth.deleteAccount();     // deletes the user, then signs out

Apple از اپ‌های دارای ورود می‌خواهد امکان حذف حساب را داخل اپ ارائه کنند. امنیت و داده‌ها را ببینید.

مدیریت خطاها#

همه‌ی فراخوانی‌ها AbrovaAuthException پرتاب می‌کنند:

dart
try {
  await auth.signInWithEmail(email: email, password: password);
} on AbrovaAuthException catch (e) {
  switch (e.code) {
    case AbrovaAuthErrorCode.invalidCredentials:
      showError('Wrong e-mail or password');
    case AbrovaAuthErrorCode.rateLimited:
      showError('Too many attempts. Try again in ${e.retryAfter?.inSeconds ?? 60} s');
    case AbrovaAuthErrorCode.networkError:
      showError('No connection');
    default:
      showError('Sign-in failed');
  }
}

مقدار code یکی از AbrovaAuthErrorCode است؛ message یک راهنمای انگلیسی برای توسعه‌دهنده است، نه برای کاربر. isNetworkError و isSessionEnded در حالت‌های رایج کمک می‌کنند. خطای شبکه هرگز کاربر را خارج نمی‌کند؛ وقتی نشست پایان می‌یابد (لغوشده، منقضی، حساب غیرفعال)، SDK خارج می‌شود و authStateChanges مقدار null می‌فرستد. همه‌ی کدها: کدهای خطا.

عیب‌یابی#

METHOD_DISABLED یا PRODUCT_DISABLED

Abrova Auth را در تنظیمات › محصولات و روش را در Abrova Auth › روش‌های ورود روشن کنید. با getMethods() فقط روش‌هایی را نشان دهید که روشن‌اند.

کاربر ناشناس جدید در هر بار اجرا

پیش از خواندن currentUser، initialize() را صدا بزنید و فقط وقتی currentUser برابر null است وارد شوید.

خطای INVALID_ID_TOKEN از Apple یا Google

بررسی کنید bundle ID، Services ID یا client ID در کنسول باشد، و به ارائه‌دهنده AbrovaAuthNonce.sha256Hex(raw) و به ابرووا مقدار خام را داده باشید.

SDKهای دیگر ابرووا هنوز به جای کاربر قبلی عمل می‌کنند

آن‌ها توکن‌شان را cache می‌کنند. متد refresh آن‌ها (مثلاً AbrovaSync.refreshUserToken()) را از listener مربوط به authStateChanges صدا بزنید.

این صفحه مفید بود؟
گزارش مشکل