SDK Flutter
Abrova Auth برای Flutter (abrova_auth). ورود ناشناس، Apple، Google، ایمیل و رمز عبور، لینک یکبارمصرف و تلگرام فقط با کلید عمومی؛ نشست در حافظهی امن نگه داشته میشود و توکن کاربر در همهی SDKهای ابرووا کار میکند.
فقط از کلید API عمومی استفاده میکند. قرار دادنش در اپ امن است
initialize() نشست ذخیرهشده را بدون درخواست شبکه بارگذاری میکند
refresh token در Keychain / حافظهی متکی به Keystore
tokenProvider و chatTokenProvider برای SDKهای دیگر ابرووا
ناشناس، Apple، Google، ایمیل، لینک یکبارمصرف، تلگرام
linkApple، linkGoogle و linkPassword شناسهی کاربر را حفظ میکنند
این صفحه 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 اضافه کنید:
dependencies: abrova_auth: hosted: https://center.abrova.ir/api/packages/abrova/pub version: ^0.1.1
سپس نصبش کنید:
flutter pub get
در کنسول ابرووا، Abrova Auth را برای پروژه (تنظیمات › محصولات) و روشهای ورود دلخواه را (Abrova Auth › روشهای ورود) روشن کنید.
مقداردهی اولیه#
AbrovaAuth.initialize را یک بار، پیش از runApp، با کلید API عمومی (ab_live_...) صدا بزنید. این تابع نشست ذخیرهشده روی دستگاه را بدون درخواست شبکه بازیابی میکند، پس currentUser بلافاصله آماده است.
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 مانده، تمدیدش کن. |
| storage | SecureAbrovaAuthStorage() | محل نگهداری نشست. MemoryAbrovaAuthStorage چیزی نگه نمیدارد (برای تست). |
ورود#
فقط روشهایی را نشان دهید که پروژهتان روشن کرده، و فقط وقتی کسی هنوز وارد نشده ورود را انجام دهید:
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های دیگر ابرووا#
AbrovaTrace.setUserId(auth.currentUser!.id) به ابرووا تریس وصل کنید.token provider را بدهید. SDK دیگر هر وقت به توکن نیاز داشت آن را از provider میخواهد؛ Abrova Auth توکن را پیش از انقضا تمدید میکند و درخواستکنندههای همزمان در یک تمدید شریک میشوند.
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، ایمیل و رمز عبور، لینک یکبارمصرف، تلگرام.
ایمیل و رمز عبور
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 › تنظیمات شروع شود.
لینک یکبارمصرف
await auth.sendMagicLink(email, redirectUrl: 'myapp://auth/magic'); // When the app is opened with the link: await auth.signInWithMagicLink(Uri.parse(link).queryParameters['token']!);
تلگرام
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 خام را به ابرووا بدهید:
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 را ببینید.
ارتقای کاربر ناشناس#
وصل کردن شناسهی کاربر را حفظ میکند، پس دادههای کاربر مال خودش میماند:
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.
}کاربران ناشناس و ارتقا را ببینید.
کاربر فعلی#
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| فیلد | نوع | توضیح |
|---|---|---|
| id | String | شناسهی کاربر (ru_...) |
| anonymous | bool | تا وقتی روشی وصل نشده true است |
| emailVerified | bool | وقتی ایمیل ثابت شده باشد true است |
| createdAt | DateTime? | زمان ساخت کاربر |
| providers | List<String> | روشهای وصلشده، مثلاً apple، password |
خروج و حذف حساب#
await auth.signOut(); // this device; never fails await auth.signOutEverywhere(); // every device await auth.deleteAccount(); // deletes the user, then signs out
Apple از اپهای دارای ورود میخواهد امکان حذف حساب را داخل اپ ارائه کنند. امنیت و دادهها را ببینید.
مدیریت خطاها#
همهی فراخوانیها AbrovaAuthException پرتاب میکنند:
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 صدا بزنید.