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

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

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

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

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

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

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

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

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

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

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

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() של האובייקט Activity. אם המשתמש בחר ליצור חשבון, התוצאה תהיה אסימון מזהה של Google. אם המשתמש סירב להירשם, על ידי סגירת ממשק המשתמש של לחיצה אחת או הקשה מחוץ לו, התוצאה תוחזר עם הקוד 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) {
                    // ...
            }
        }
    }
    // ...
}

הפסקת ההצגה של ממשק המשתמש של התחברות בלחיצה אחת

אם המשתמש דחה את הכניסה, הקריאה ל-getSignInCredentialFromIntent() תחזיר ApiException עם קוד סטטוס CommonStatusCodes.CANCELED. במקרה כזה, כדאי להפסיק זמנית את הצגת ממשק המשתמש של הכניסה בלחיצה אחת, כדי לא להציק למשתמשים עם הנחיות חוזרות. בדוגמה הבאה, הפעולה הזו מתבצעת על ידי הגדרת מאפיין בפעילות, שמשמש לקביעה אם להציע למשתמש כניסה בלחיצה אחת. עם זאת, אפשר גם לשמור ערך ב-SharedPreferences או להשתמש בשיטה אחרת.

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

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