יצירת חשבונות חדשים בהקשה אחת

אם אתם תומכים בכניסה באמצעות חשבונות Google, תוכלו להשתמש בלקוח הכניסה בהקשה אחת כדי לספק למשתמשים חוויה חלקה של יצירת חשבון שאף פעם לא מוציאים אותם מהקשר של האפליקציה.

ממשק משתמש להרשמה בהקשה אחת

בממשק המשתמש של One Tap, המשתמשים מתבקשים ליצור חשבון חדש באפליקציה באמצעות אחד מחשבונות Google שבמכשיר. אם המשתמש יבחר להמשיך, תקבלו אסימון מזהה עם פרטי הפרופיל הבסיסיים – השם, תמונת הפרופיל וכתובת האימייל המאומתת שלו – ותוכלו להשתמש בו כדי ליצור את החשבון החדש.

ההטמעה של יצירת חשבון בהקשה אחת כוללת שני חלקים:

  • שילוב של הלקוח בהקשה אחת באפליקציה שלכם, כפי שמתואר בדף הזה. זה בדרך כלל דומה לשימוש בכניסה באמצעות הקשה אחת, אבל עם כמה הבדלים בהגדרות.
  • הוספת האפשרות לקצה העורפי כוללת את היכולת ליצור חשבונות משתמש מאסימונים מזהים של Google, כפי שמתואר במאמר שימוש באסימונים מזהים בקצה העורפי.

איפה כדאי להירשם ל'הקשה אחת'?

המקום המשמעותי ביותר שבו אפשר להציע למשתמשים הרשמה בהקשה אחת הוא בהקשר שבו כניסה לחשבון תאפשר תכונות חדשות. קודם כל, נסו להכניס את המשתמש לחשבון באמצעות פרטי כניסה שמורים. אם לא נמצאו פרטי כניסה שמורים, הציעו למשתמש ליצור חשבון חדש.

לפני שמתחילים

מגדירים את הפרויקט במסוף Google APIs ופרויקט Android, כפי שמתואר במאמר תחילת העבודה עם כניסה בהקשה אחת.

‫1. הגדרת הלקוח בהקשה אחת

כדי להגדיר את הלקוח בהקשה אחת ליצירת חשבון:

  • אל תפעילו בקשות לפרטי כניסה לסיסמה. (הרשמה בהקשה אחת אפשרית רק באימות מבוסס אסימונים.)
  • הפעל בקשות לאסימון Google ID באמצעות setGoogleIdTokenRequestOptions() וההגדרות הבאות:

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. מעקב אחר הביטול של ממשק המשתמש בהקשה אחת

עליכם לבדוק אם המשתמש כבר סירב להשתמש בהרשמה בהקשה אחת, על ידי סגירת ההודעה או הקשה מחוץ לה. זה יכול להיות פשוט כמו נכס בוליאני של הפעילות. (ראו הפסקת ההצגה של ממשק המשתמש בהקשה אחת בהמשך).

3. הצגת ממשק המשתמש להרשמה בהקשה אחת

אם המשתמש לא סירב להשתמש בהקשה אחת ליצירת חשבון חדש, קוראים ל-method beginSignIn() של אובייקט הלקוח ומצרפים מאזינים ל-Task שמוחזר. אפליקציות בדרך כלל עושות את השלב הזה כשבקשת כניסה בהקשה אחת לא מוצאת פרטי כניסה שמורים, כלומר, במאזין הכשל של בקשת הכניסה.

הלקוח בהקשה אחת יקרא ל-listener, אם למשתמש מוגדר חשבון Google אחד או יותר. ב-Success listener, אפשר לקבל מהתוצאה של Task את כוונת המשתמש בהמתנה ולהעביר אותה ל-startIntentSenderForResult() כדי להפעיל את ממשק המשתמש של One Tap.

אם למשתמש אין חשבונות 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 ID. אם המשתמש סירב להירשם, על ידי סגירת ממשק המשתמש One Tap או הקשה מחוץ לו, התוצאה תחזור עם הקוד RESULT_CANCELED. האפליקציה צריכה לטפל בשתי האפשרויות האלה.

יצירת חשבון עם אסימון מזהה של Google

אם המשתמש בחר להירשם עם חשבון Google, ניתן לך לקבל אסימון מזהה שלו על ידי העברת נתוני ה-Intent מ-onActivityResult() ל-method 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})")
                        }
                    }
                }
            }
        }
    }
    // ...
}

השלבים הבאים

כשמשתמש משלים את תהליך ההרשמה ל-One Tap, מקבלים אסימון Google ID שכולל כמה פרטי פרופיל בסיסיים: כתובת האימייל של המשתמש, שם מלא וכתובת URL של תמונת פרופיל. לאפליקציות רבות המידע הזה מספיק כדי לאמת את המשתמש בקצה העורפי וליצור חשבון חדש.

אם אתם צריכים מידע נוסף כדי ליצור חשבון – למשל, תאריך הלידה של המשתמש – מציגים למשתמש תהליך של פרטי הרשמה, שבו אתם מבקשים את המידע הנוסף הזה. לאחר מכן, שלחו אותו לקצה העורפי שלכם כדי להשלים את יצירת החשבון.