אם יש אפשרות להיכנס באמצעות חשבונות Google, אפשר להשתמש בכניסה באמצעות One Tap כדי לספק למשתמשים שלכם חוויה חלקה ביצירת חשבון הם אף פעם לא מוציאים אותם מההקשר של האפליקציה.
כשמציגים את ממשק המשתמש בהקשה אחת, המשתמשים מתבקשים ליצור חשבון חדש עם את האפליקציה באמצעות אחד מחשבונות Google במכשיר שלהם. אם המשתמש בוחר תקבלו אסימון מזהה עם פרטי פרופיל בסיסיים - שם, תמונת פרופיל וכתובת האימייל המאומתת שלהם — שבהם אפשר להשתמש כדי יוצרים את החשבון החדש.
ההטמעה של יצירת חשבון בהקשה אחת כוללת שני חלקים:
- שילוב של לקוח One Tap באפליקציה שלכם, כפי שמתואר בדף הזה. זה בדרך כלל דומה לשימוש בכניסה באמצעות הקשה אחת, אבל יש כמה הבדלים הגדרה אישית.
- הוספה לקצה העורפי של האפשרות ליצור חשבונות משתמשים מ-Google ID באמצעות אסימונים מזהים, כמו שמוסבר במאמר שימוש באסימונים מזהים בקצה העורפי.
איפה כדאי להשתמש בהרשמה ל-One Tap?
המקום החשוב ביותר שבו אפשר להציע למשתמשים הרשמה לתכונה 'הקשה אחת' הוא בהקשר שבו כניסה לחשבון תאפשר תכונות חדשות. קודם כל, מנסים להכניס את המשתמש באמצעות פרטי כניסה שמורים. אם לא נמצאו פרטי כניסה שמורים, הציעו ליצור פרטי כניסה חדשים חשבון עבור המשתמש.
לפני שמתחילים
מגדירים את הפרויקט במסוף Google APIs ופרויקט Android כפי שמתואר במאמר תחילת העבודה עם כניסה לחשבון בהקשה אחת.
1. הגדרת הלקוח בהקשה אחת
כדי להגדיר את הלקוח בהקשה אחת ליצירת חשבון:
- אין להפעיל בקשות לפרטי כניסה לסיסמאות. (אפשר להירשם בהקשה אחת בלבד עם אימות שמבוסס על אסימונים).
הפעלת בקשות לאסימון מזהה של Google באמצעות
setGoogleIdTokenRequestOptions()
וגם ההגדרות האלה:- מגדירים את מזהה הלקוח של השרת למזהה שיצרתם ב-Google APIs של Google. לתשומת ליבכם: זהו מזהה הלקוח של השרת שלכם, ולא מזהה הלקוח ב-Android.
- מגדירים את הלקוח להצגת כל חשבונות Google במכשיר – היא לא לסנן לפי חשבונות מורשים.
- אפשר גם לבקש את מספר הטלפון המאומת מספר לחשבון.
Java
public class YourActivity extends AppCompatActivity { // ... private SignInClient oneTapClient; private BeginSignInRequest signUpRequest; @Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); oneTapClient = Identity.getSignInClient(this); signUpRequest = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Show all accounts on the device. .setFilterByAuthorizedAccounts(false) .build()) .build(); // ... } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private lateinit var oneTapClient: SignInClient private lateinit var signUpRequest: BeginSignInRequest override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) oneTapClient = Identity.getSignInClient(this) signUpRequest = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions( BeginSignInRequest.GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Show all accounts on the device. .setFilterByAuthorizedAccounts(false) .build()) .build() // ... } // ... }
2. מעקב אחר הביטול של ממשק המשתמש בהקשה אחת
עליך לבדוק אם המשתמש כבר סירב להשתמש בהקשה אחת להירשם על ידי סגירת ההצעה או הקשה מחוץ לה. סוג הפריט יכול להיות: פשוט כמאפיין בוליאני של הפעילות שלך. (עיינו בקטע הפסקת ההצגה של הקשה אחת) UI, שלמטה.)
3. הצגת ממשק המשתמש של ההרשמה בהקשה אחת
אם המשתמש לא סירב להשתמש בהקשה אחת ליצירת חשבון חדש, קוראים
ה-method beginSignIn()
של אובייקט הלקוח, ומצרפים מאזינים אל Task
החזרות. בדרך כלל אפליקציות עושות את השלב הזה אם לא נמצאה בקשת כניסה בהקשה אחת
פרטי כניסה שמורים – כלומר, ברכיב ה-listener של הכניסה
בקשה.
הלקוח One Tap יקרא ל'מאזינים להצלחה' אם למשתמש יש אחד או יותר
חשבונות Google שהוגדרו במכשיר. בתוך המאזינים להצלחה,
Intent מהתוצאה Task
ומעבירים אותה אל startIntentSenderForResult()
מפעילים את ממשק המשתמש בהקשה אחת.
אם למשתמש אין חשבונות Google במכשיר, אפליקציית One Tap יקרא ל-כשל בהאזנה. במקרה כזה לא נדרשת פעולה מצידך: אפשר פשוט ימשיך להציג את החוויה של יציאה מהחשבון באפליקציה, והמשתמש יכול להירשם בתהליך הרגיל ליצירת חשבון.
Java
oneTapClient.beginSignIn(signUpRequest)
.addOnSuccessListener(this, new OnSuccessListener<BeginSignInResult>() {
@Override
public void onSuccess(BeginSignInResult result) {
try {
startIntentSenderForResult(
result.getPendingIntent().getIntentSender(), REQ_ONE_TAP,
null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Couldn't start One Tap UI: " + e.getLocalizedMessage());
}
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// No Google Accounts found. Just continue presenting the signed-out UI.
Log.d(TAG, e.getLocalizedMessage());
}
});
Kotlin
oneTapClient.beginSignIn(signUpRequest)
.addOnSuccessListener(this) { result ->
try {
startIntentSenderForResult(
result.pendingIntent.intentSender, REQ_ONE_TAP,
null, 0, 0, 0)
} catch (e: IntentSender.SendIntentException) {
Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
}
}
.addOnFailureListener(this) { e ->
// No Google Accounts found. Just continue presenting the signed-out UI.
Log.d(TAG, e.localizedMessage)
}
4. טיפול בתשובה של המשתמש
תגובת המשתמש לבקשת ההרשמה בהקשה אחת תדווח לאפליקציה שלך
באמצעות השיטה onActivityResult()
של הפעילות שלך. אם המשתמש בחר ליצור
התוצאה תהיה אסימון מזהה של Google. אם המשתמש סירב להירשם,
על ידי סגירת ממשק המשתמש בהקשה אחת או הקשה מחוץ לו, התוצאה תחזור
עם הקוד RESULT_CANCELED
. האפליקציה שלך צריכה לטפל בשתי האפשרויות.
יצירת חשבון עם אסימון מזהה של Google
אם המשתמש בחר להירשם באמצעות חשבון Google, תוכלו לקבל אסימון מזהה עבור
המשתמש על ידי העברה של נתוני Intent מ-onActivityResult()
אל הקשה אחת
שיטת getSignInCredentialFromIntent()
של הלקוח. פרטי הכניסה יכללו את
נכס googleIdToken
שאינו null.
להשתמש באסימון המזהה כדי ליצור חשבון בקצה העורפי (מידע נוסף זמין בקטע אימות באמצעות העורפי באמצעות אסימונים מזהים) והכניסה של המשתמש לחשבון.
פרטי הכניסה מכילים גם את כל הפרטים הנוספים שביקשתם, כמו מספר הטלפון המאומת של החשבון, אם הוא זמין.
Java
public class YourActivity extends AppCompatActivity { // ... private static final int REQ_ONE_TAP = 2; // Can be any integer unique to the Activity. private boolean showOneTapUI = true; // ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_ONE_TAP: try { SignInCredential credential = oneTapClient.getSignInCredentialFromIntent(data); String idToken = credential.getGoogleIdToken(); if (idToken != null) { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token."); } } catch (ApiException e) { // ... } break; } } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private val REQ_ONE_TAP = 2 // Can be any integer unique to the Activity private var showOneTapUI = true // ... override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQ_ONE_TAP -> { try { val credential = oneTapClient.getSignInCredentialFromIntent(data) val idToken = credential.googleIdToken when { idToken != null -> { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token.") } else -> { // Shouldn't happen. Log.d(TAG, "No ID token!") } } } catch (e: ApiException) { // ... } } } // ... }
הפסקת ההצגה של ממשק המשתמש בהקשה אחת
אם המשתמש סירב להיכנס לחשבון, הוא יתקשר למספר getSignInCredentialFromIntent()
תקפיץ ApiException
עם קוד הסטטוס CommonStatusCodes.CANCELED
.
במקרה כזה, עליך להפסיק באופן זמני את הצגת ממשק המשתמש לכניסה בהקשה אחת
כדי שלא תעצבנו את המשתמשים באמצעות הנחיות חוזרות. הדוגמה הבאה
עושה זאת על ידי הגדרה של נכס בפעילות, שבו הוא משתמש כדי
לקבוע אם להציע למשתמש כניסה באמצעות הקשה אחת; אבל אפשר גם
לשמור ערך ב-SharedPreferences
או להשתמש בשיטה אחרת.
חשוב ליישם הגבלת קצב של בקשות כניסה באמצעות 'הקשה אחת'. אם לא עשיתם זאת, והמשתמש ביטל כמה הנחיות ברצף, הלקוח One Tap לא תשלח הודעה למשתמש במשך 24 השעות הבאות.
Java
public class YourActivity extends AppCompatActivity { // ... private static final int REQ_ONE_TAP = 2; // Can be any integer unique to the Activity. private boolean showOneTapUI = true; // ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_ONE_TAP: try { // ... } catch (ApiException e) { switch (e.getStatusCode()) { case CommonStatusCodes.CANCELED: Log.d(TAG, "One-tap dialog was closed."); // Don't re-prompt the user. showOneTapUI = false; break; case CommonStatusCodes.NETWORK_ERROR: Log.d(TAG, "One-tap encountered a network error."); // Try again or just ignore. break; default: Log.d(TAG, "Couldn't get credential from result." + e.getLocalizedMessage()); break; } } break; } } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private val REQ_ONE_TAP = 2 // Can be any integer unique to the Activity private var showOneTapUI = true // ... override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQ_ONE_TAP -> { try { // ... } catch (e: ApiException) { when (e.statusCode) { CommonStatusCodes.CANCELED -> { Log.d(TAG, "One-tap dialog was closed.") // Don't re-prompt the user. showOneTapUI = false } CommonStatusCodes.NETWORK_ERROR -> { Log.d(TAG, "One-tap encountered a network error.") // Try again or just ignore. } else -> { Log.d(TAG, "Couldn't get credential from result." + " (${e.localizedMessage})") } } } } } } // ... }
השלבים הבאים
כשמשתמש מסיים את תהליך ההרשמה בהקשה אחת, אתם מקבלים אסימון מזהה של Google, כולל כמה מפרטי הפרופיל הבסיסיים: כתובת האימייל של המשתמש, שם מלא, וכתובת ה-URL של תמונת הפרופיל. עבור אפליקציות רבות, המידע הזה מספיק כדי לאמת את המשתמש בקצה העורפי וליצור חשבון חדש.
אם אתם זקוקים למידע נוסף כדי להשלים את יצירת החשבון – לדוגמה, תאריך הלידה של המשתמש — יש להציג למשתמש תהליך של פרטי הרשמה, שבו אם מבקשים את המידע הנוסף. לאחר מכן, שולחים אותו לקצה העורפי כדי להשלים את יצירת החשבון.