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

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

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

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

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

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

איפה כדאי להשתמש בהרשמה בלחיצה אחת?

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

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

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

1. הגדרת לקוח One Tap

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

  • לא מפעילים בקשות של פרטי כניסה באמצעות סיסמה. (אפשר להירשם בהקשה אחת רק באמצעות אימות שמבוסס על אסימונים).
  • מפעילים בקשות לאסימוני מזהה של Google באמצעות 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. מעקב אחר ביטולים של ממשק המשתמש של One Tap

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

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

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

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

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

אם המשתמש בחר להירשם באמצעות חשבון Google, אפשר לקבל אסימון מזהה עבור המשתמש על ידי העברת נתוני הכוונה מ-onActivityResult() לשיטה getSignInCredentialFromIntent() של לקוח One Tap. לפרטי הכניסה יהיה מאפיין 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) {
                    // ...
            }
        }
    }
    // ...
}

הפסקת הצגת ממשק המשתמש של One Tap

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

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