استفاده با محصولات دیگر ابرووا
توکنِ کاربرِ واردشده در Abrova Auth همان توکن کاربر استاندارد ابرووا است. token provider مربوط به SDK Auth را به Abrova Sync، Chat، Push، A/B Testing و Storage بدهید تا قوانین امنیتیشان کاربر را بهصورت auth.uid ببینند. بدون نیاز به سرور.
Abrova Sync، Chat، Push، A/B Testing و Storage کاربر اپ شما را با یک توکن کاربر ابرووای امضاشده میشناسند. بدون Abrova Auth، سرور خودتان این توکن را با کلید سرور میسازد. با Abrova Auth، توکن از قبل در SDK Auth هست: token provider آن را به SDKهای دیگر بدهید تا بهعنوان کاربرِ واردشده عمل کنند.
ابرووا تریس، از امروز#
ابرووا تریس فعال است. شناسهی کاربر Abrova Auth را به آن بدهید تا خطاها و کرشها نشان دهند برای کدام کاربر رخ دادهاند. آن را بعد از ورود تنظیم کنید و بعد از خروج پاک کنید:
// Flutter AbrovaTrace.setUserId(AbrovaAuth.instance.currentUser!.id);
// iOS AbrovaTrace.shared.setUserId(AbrovaAuth.shared.currentUserId) // nil after sign-out
// Android AbrovaTrace.setUserId(AbrovaAuth.shared.currentUserId) // null after sign-out
تریس فقط شناسهی کاربر را میگیرد؛ به توکن نیازی ندارد. SDK Flutter تریس، SDK iOS و SDK Android را ببینید.
چه چیزی به دست میآورید#
- قوانین امنیتی Sync بدون سرور کار میکنند.
auth.uidهمان شناسهی کاربر Abrova Auth (ru_...) است، پسdata.ownerId === auth.uidاز سندهای هر کاربر محافظت میکند. قوانین امنیتی Sync را ببینید. - Chat میداند چه کسی صحبت میکند. پیامها به نام کاربرِ توکن فرستاده میشوند؛ هیچکس نمیتواند به جای دیگری بنویسد.
- قوانین دسترسی Storage کاربر را میبینند. قوانینی مثل
users/{userId}/**به هر کاربر اجازه میدهند فقط فایلهای خودش را بخواند و بنویسد. قوانین دسترسی Storage را ببینید. - A/B Testing و Push رویدادها، variantها و پیامهای inbox را به کاربر وصل میکنند، از جمله کاربران ناشناسی که هنوز بهطور کامل وارد نشدهاند.
- چیز اضافهای برای وصل کردن نیست. SDKهای دیگر یک token provider میگیرند. توکن همان توکنی است که سرور خودتان میساخت.
توکن چطور جریان پیدا میکند#
- ۱یک SDK دیگر ابرووا به توکن نیاز داردهنگام شروع، پیش از یک درخواست، یا وقتی توکنش نزدیک انقضاست، provider را که به آن دادهاید صدا میزند.
- ۲SDK Auth پاسخ میدهدبا access token فعلی، که اگر کمتر از ۲ دقیقه از اعتبارش مانده باشد اول تمدید میشود. فراخوانیهای همزمان در یک تمدید شریک میشوند.
- ۳محصول آن را بررسی میکندامضا، پروژه و زمان انقضا را بررسی میکند و شناسهی کاربر را از توکن برمیدارد.
وقتی کسی وارد نشده، provider توکنی برنمیگرداند (یا برای Chat خطا میدهد)، و هر SDK همانطور که مستنداتش میگوید منتظر کاربر میماند.
دادن token provider#
این محصولات بهزودی میآیند؛ فراخوانیهای زیر نشان میدهند توکن را چطور خواهند گرفت.
هر جا SDKی شناسهی کاربر خواست (userId در Chat، setUserId در A/B Testing)، شناسهی کاربر را از Abrova Auth بدهید تا با توکن جور باشد.
Flutter
final auth = AbrovaAuth.instance; // Abrova Sync await AbrovaSync.init(AbrovaSyncConfig( apiKey: 'ab_live_your_api_key', tokenProvider: auth.tokenProvider, )); // Abrova Push await AbrovaPush.init(AbrovaPushConfig( apiKey: 'ab_live_your_api_key', tokenProvider: auth.tokenProvider, )); // Abrova A/B Testing await AbrovaAbTesting.init(AbrovaAbTestingConfig( apiKey: 'ab_live_your_api_key', tokenProvider: auth.tokenProvider, )); // Abrova Storage final storage = AbrovaStorage( apiKey: 'ab_live_your_api_key', tokenProvider: auth.tokenProvider, ); // Abrova Chat: its provider must return a token, so use chatTokenProvider final chat = AbrovaChatClient(AbrovaChatConfig( apiKey: 'ab_live_your_api_key', userId: auth.currentUser!.id, tokenProvider: auth.chatTokenProvider, ));
وقتی کسی وارد نشده، tokenProvider مقدار null برمیگرداند. chatTokenProvider به جای آن خطای UNAUTHENTICATED میدهد؛ کلاینت Chat را بعد از ورود بسازید.
iOS
let auth = AbrovaAuth.shared
// Abrova Sync
sync.userTokens.provider = auth.tokenProvider
// Abrova Push
AbrovaPushConfig(apiKey: key, tokenProvider: auth.tokenProvider)
// Abrova Storage
let storage = AbrovaStorage(apiKey: key, userTokenProvider: auth.tokenProvider)
// Abrova Chat: create the client after sign-in
AbrovaChatConfig(apiKey: key, userId: auth.currentUserId!, tokenProvider: auth.strictTokenProvider)
// Abrova A/B Testing takes a completion handler
AbrovaAbTestingConfig(apiKey: key, tokenProvider: { completion in
Task {
do { completion(.success(try await auth.strictTokenProvider())) }
catch { completion(.failure(error)) }
}
})وقتی کسی وارد نشده، tokenProvider مقدار nil برمیگرداند؛ strictTokenProvider خطا میدهد.
Android
val auth = AbrovaAuth.shared
// Abrova Sync: its provider is called off the main thread
AbrovaSyncConfig.builder(apiKey).userTokenProvider(auth.blockingTokenProvider).build()
// Abrova Push
AbrovaPushConfig(apiKey = apiKey, tokenProvider = auth.tokenProvider)
// Abrova Storage: also called off the main thread
AbrovaStorage.builder(apiKey).userTokenProvider(auth.blockingTokenProvider).build()
// Abrova A/B Testing: also called off the main thread
AbrovaAbTestingConfig(apiKey = apiKey, tokenProvider = AbrovaTokenProvider { auth.blockingTokenProvider() })
// Abrova Chat: create the client after sign-in
AbrovaChatConfig(apiKey = apiKey, userId = auth.currentUserId!!, tokenProvider = auth.strictTokenProvider)tokenProvider یک تابع suspend است که وقتی کسی وارد نشده null برمیگرداند؛ strictTokenProvider به جای آن خطا میدهد؛ blockingTokenProvider thread فراخواننده را block میکند و هرگز نباید روی main thread اجرا شود.
Web
import { createAbrovaAuth } from '@abrova/auth-web';
import { AbrovaSync } from '@abrova/sync-web';
import { AbrovaStorage } from '@abrova/storage-web';
const auth = createAbrovaAuth({ apiKey: 'ab_live_your_api_key' });
// Abrova Sync, Push, A/B Testing and Storage: null while signed out
const sync = new AbrovaSync({ apiKey: 'ab_live_your_api_key', tokenProvider: () => auth.getToken() });
const storage = new AbrovaStorage({ apiKey: 'ab_live_your_api_key', tokenProvider: () => auth.getToken() });
// Abrova Chat: auth.tokenProvider rejects with UNAUTHENTICATED while signed out
const chat = new AbrovaChatClient({
apiKey: 'ab_live_your_api_key',
userId: auth.currentUserId!,
tokenProvider: auth.tokenProvider,
});React Native
import AbrovaSync from '@abrova/sync-react-native';
import { AbrovaStorage } from '@abrova/storage-react-native';
// Abrova Sync, Push, A/B Testing and Storage: null while signed out
await AbrovaSync.init({ apiKey: 'ab_live_your_api_key', tokenProvider: () => auth.getToken() });
const storage = new AbrovaStorage({ apiKey: 'ab_live_your_api_key', tokenProvider: () => auth.getToken() });
// Abrova Chat: create the client after sign-in
const chat = new AbrovaChatClient({
apiKey: 'ab_live_your_api_key',
userId: auth.currentUserId!,
tokenProvider: auth.tokenProvider,
});وقتی کاربر وارد یا خارج میشود#
SDKهای دیگر توکنی را که دارند cache میکنند. بعد از ورود، خروج یا جابهجایی به کاربر دیگر، به آنها بگویید دوباره از provider بخواهند:
| محصول | فراخوانی |
|---|---|
| Abrova Sync | AbrovaSync.refreshUserToken() (Flutter، React Native، Web)؛ sync.userTokens.refresh() (Android)؛ sync.refreshUserToken() (iOS) |
| Abrova A/B Testing | refreshUserToken() بعد از ورود؛ clearUserId() بعد از خروج |
| Abrova Storage | storage.refreshUserToken() (همهی پلتفرمها). تا وقتی کسی وارد نشده، فراخوانیهای فایل منتظر میمانند و بعد از ورود ادامه مییابند. |
| Abrova Chat | کلاینت را برای کاربر جدید بسازید؛ قبلی را قطع کنید |
به وضعیت ورود SDK Auth (authStateChanges، onAuthStateChanged، addAuthStateListener یا authState) گوش دهید و این فراخوانیها را همانجا انجام دهید تا همهی محصولات کاربر را دنبال کنند.
نوشتن قوانین امنیتی برای کاربر#
شناسهی کاربر در توکن، همان auth.uid در قوانین Abrova Sync است. آن را در سندهایی که مال کاربرند ذخیره کنید:
{
"rules": {
"notes": {
".read": "data.ownerId === auth.uid",
".write": "newData.ownerId === auth.uid"
}
}
}await AbrovaSync.database('my-app').collection('notes').add({
'ownerId': AbrovaAuth.instance.currentUser!.id,
'text': 'Hello',
});سپس Require signed user tokens را برای Sync در کنسول روشن کنید تا فقط توکن امضاشده بتواند auth.uid را تعیین کند. قوانین امنیتی Sync را ببینید.
همراه با سرور خودتان#
همچنان میتوانید روی سرور خودتان با کلید سرور (POST https://auth.abrova.ir/users/token) برای شناسههای کاربرِ خودتان توکن بسازید. هر دو نوع توکن در همهی محصولات کار میکنند. برای هر اپ یک منبع شناسهی کاربر نگه دارید تا یک شخص دو کاربر نشود.