ورود با Google
کاربران را از طریق Abrova Auth با Google وارد کنید. اپ ورود بومی Google را با nonce هششده اجرا میکند؛ ابرووا ID token مربوط به Google را برای OAuth client IDهای خودتان بررسی میکند.
اپ شما ورودِ خودِ Google را اجرا میکند (Credential Manager در Android، Google Sign-In در iOS و Flutter، و Google Identity Services در وب) و یک ID token میگیرد. SDK این توکن را به Abrova Auth میفرستد؛ Abrova Auth بررسی میکند که Google آن را برای یکی از OAuth client IDهای شما صادر کرده باشد و کاربر را وارد میکند.
ورود با Google به اتصال به Google، و در Android به Google Play services هم، نیاز دارد. بعضی کاربران در ایران هیچکدام را ندارند: گوشیهایی که بدون Google Play services فروخته شدهاند، یا سرویسهای Google که در دسترس نیستند. برای آنها دکمهی Google پیش از اینکه به Abrova Auth برسد شکست میخورد. ناشناس، ایمیل و رمز عبور، لینک یکبارمصرف و کد تلگرام بدون Google کار میکنند، پس دستکم یکی از آنها را کنار دکمهی Google بگذارید.
راهاندازی در کنسول#
- در Google Cloud Console › APIs & Services › Credentials، OAuth client IDهایی را که اپهایتان با آنها وارد میشوند پیدا کنید (یا بسازید). Android، iOS و وب هر کدام client ID خودشان را دارند.
- در کنسول ابرووا، Abrova Auth › روشهای ورود را باز کنید، Google را روشن کنید و همهی client IDهایی را که اپهایتان استفاده میکنند اضافه کنید.
Abrova Auth فقط ID tokenی از Google را میپذیرد که audience آن یکی از این client IDها باشد.
در Android با Credential Manager، و در google_sign_in وقتی serverClientId را میدهید، ID token برای client ID وب شما صادر میشود. client ID وب را به فهرست اضافه کنید، حتی اگر اپ وب ندارید.
مقدار nonce#
با تابع کمکی SDK یک nonce خام تصادفی بسازید، SHA-256 آن را بهصورت hex با حروف کوچک به Google بدهید و مقدار خام را به Abrova Auth. ابرووا بررسی میکند که این دو با هم جور باشند و هر nonce را فقط یک بار میپذیرد. ID token باید کمتر از ۱۰ دقیقه عمر داشته باشد.
| SDK | nonce خام | مقدار برای Google |
|---|---|---|
| Flutter | AbrovaAuthNonce.generate() | AbrovaAuthNonce.sha256Hex(raw) |
| iOS | AbrovaNonce.generate() | AbrovaNonce.sha256(raw) |
| Android | AbrovaNonce.generate() | AbrovaNonce.sha256(raw) |
| Web، React Native | (await auth.createNonce()).rawNonce | (await auth.createNonce()).hashedNonce |
Abrova Auth ورود با Google بدون nonce خام را رد میکند (INVALID_INPUT)، به همین دلیل همهی SDKها آن را الزامی کردهاند.
ورود#
Android (Credential Manager)
androidx.credentials:credentials، androidx.credentials:credentials-play-services-auth و com.google.android.libraries.identity.googleid:googleid را به اپ اضافه کنید:
val rawNonce = AbrovaNonce.generate()
val option = GetGoogleIdOption.Builder()
.setServerClientId(WEB_CLIENT_ID)
.setFilterByAuthorizedAccounts(false)
.setNonce(AbrovaNonce.sha256(rawNonce))
.build()
val response = CredentialManager.create(context)
.getCredential(context, GetCredentialRequest.Builder().addCredentialOption(option).build())
val idToken = GoogleIdTokenCredential.createFrom(response.credential.data).idToken
AbrovaAuth.shared.signInWithGoogle(idToken, rawNonce)Flutter
با google_sign_in نسخهی ۷:
final raw = AbrovaAuthNonce.generate(); await GoogleSignIn.instance.initialize( serverClientId: 'xxx.apps.googleusercontent.com', nonce: AbrovaAuthNonce.sha256Hex(raw), ); final account = await GoogleSignIn.instance.authenticate(); await AbrovaAuth.instance.signInWithGoogle( idToken: account.authentication.idToken!, rawNonce: raw, );
iOS
ID token مربوط به Google را با AbrovaNonce.sha256(rawNonce) بهعنوان nonce درخواست کنید، سپس:
try await AbrovaAuth.shared.signInWithGoogle(idToken: idToken, rawNonce: rawNonce)
Web و React Native
hashedNonce را بهعنوان nonce به Google Identity Services (وب) یا کتابخانهی ورود با Google در React Native بدهید:
const { rawNonce, hashedNonce } = await auth.createNonce();
// ... run Google's sign-in with nonce: hashedNonce, then:
await auth.signInWithGoogle({ idToken, rawNonce });ایمیل#
Abrova Auth از ایمیل Google فقط وقتی استفاده میکند که Google بگوید تأییدشده است، و آن را (رمزگذاریشده) فقط وقتی ذخیره میکند که ذخیرهی اطلاعات پروفایل در Abrova Auth › تنظیمات روشن باشد. یک حساب Google و یک حساب Apple یا رمز عبور با همان ایمیل، کاربران جداگانه میمانند مگر اینکه کاربر آنها را به هم وصل کند.
وصل کردن Google به کاربرِ واردشده#
برای ارتقای کاربر ناشناس، linkGoogle(...) را با همان آرگومانها صدا بزنید. شناسهی کاربر همان میماند. اگر این حساب Google از قبل متعلق به کاربر دیگری باشد، فراخوانی با PROVIDER_ALREADY_LINKED شکست میخورد.
خطاها#
| کد | معنا |
|---|---|
| NOT_CONFIGURED | Google روشن است، اما هیچ client ID وارد نشده است. |
| INVALID_ID_TOKEN | Google آن را امضا نکرده، برای client IDی صادر شده که در فهرست شما نیست، بیش از ۱۰ دقیقه عمر دارد، یا nonce آن SHA-256 همان nonce خامی که فرستادید نیست. |
| INVALID_INPUT | nonce خام فرستاده نشده یا بین ۱۶ تا ۲۵۶ کاراکتر نیست. |
| NONCE_REUSED | این nonce قبلاً استفاده شده است. برای هر ورود یک nonce جدید بسازید. |
| PROVIDER_ALREADY_LINKED | فقط هنگام وصل کردن: این حساب Google متعلق به کاربر دیگری است. |
| METHOD_DISABLED | ورود با Google برای پروژه خاموش است. |