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

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

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

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

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

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

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

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

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

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

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

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

אם המשתמש בוחר להירשם עם חשבון Google, תוכלו לקבל אסימון מזהה שלו על ידי העברת נתוני ה-Intent מ-onActivityResult() ל-method getSignInCredentialFromIntent() של הלקוח בהקשה אחת. לפרטי הכניסה יהיה מאפיין googleIdToken שאינו ריק.

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

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

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

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