שילוב כניסה באמצעות חשבון Google באפליקציית Android

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

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

מגדירים פרויקט ב-Google API Console ומגדירים את הפרויקט ב-Android Studio.

הגדרת Google Sign-in והאובייקט GoogleSignInClient

  1. בשיטה onCreate של פעילות הכניסה, מגדירים את Google Sign-In לבקש את נתוני המשתמשים הנדרשים לאפליקציה. לדוגמה, כדי להגדיר את Google Sign-In לבקש את מזהה המשתמשים ואת פרטי הפרופיל הבסיסיים שלהם, יוצרים אובייקט GoogleSignInOptions עם הפרמטר DEFAULT_SIGN_IN. כדי לבקש גם את כתובות האימייל של המשתמשים, יוצרים את האובייקט GoogleSignInOptions עם האפשרות requestEmail.

    // Configure sign-in to request the user's ID, email address, and basic
    // profile. ID and basic profile are included in DEFAULT_SIGN_IN.
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();

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

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

    // Build a GoogleSignInClient with the options specified by gso.
    mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

איך בודקים אם משתמש קיים מחובר לחשבון

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

// Check for existing Google Sign In account, if the user is already signed in
// the GoogleSignInAccount will be non-null.
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
updateUI(account);

אם הפונקציה GoogleSignIn.getLastSignedInAccount מחזירה אובייקט GoogleSignInAccount (במקום null), סימן שהמשתמש כבר נכנס לאפליקציה באמצעות חשבון Google. מעדכנים את ממשק המשתמש בהתאם – כלומר, מסתירים את לחצן הכניסה, מריצים את הפעילות הראשית או כל דבר אחר שמתאים לאפליקציה.

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

הוספת לחצן הכניסה לחשבון Google לאפליקציה

  1. הלחצן הרגיל לכניסה לחשבון Google מוסיפים את SignInButton לפריסה של האפליקציה:

    <com.google.android.gms.common.SignInButton
     android:id="@+id/sign_in_button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
    
  2. אופציונלי: אם אתם משתמשים בגרפיקה של לחצן הכניסה שמוגדרת כברירת מחדל במקום לספק נכסים משלכם של לחצן כניסה, תוכלו להתאים אישית את הגודל של הלחצן באמצעות השיטה setSize.

    // Set the dimensions of the sign-in button.
    SignInButton signInButton = findViewById(R.id.sign_in_button);
    signInButton.setSize(SignInButton.SIZE_STANDARD);
  3. בפעילות ב-Android (לדוגמה, בשיטה onCreate), רושמים את OnClickListener של הלחצן כדי להתחבר את המשתמש כשמקישים עליו:

    findViewById(R.id.sign_in_button).setOnClickListener(this);
    

התחלת תהליך הכניסה

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

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.sign_in_button:
                signIn();
                break;
            // ...
        }
    }
    
    private void signIn() {
        Intent signInIntent = mGoogleSignInClient.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }

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

  2. אחרי שהמשתמש נכנס לחשבון, אפשר לקבל אובייקט GoogleSignInAccount של המשתמש בשיטה onActivityResult של הפעילות.

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            // The Task returned from this call is always completed, no need to attach
            // a listener.
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            handleSignInResult(task);
        }
    }

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

    private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
        try {
            GoogleSignInAccount account = completedTask.getResult(ApiException.class);
    
            // Signed in successfully, show authenticated UI.
            updateUI(account);
        } catch (ApiException e) {
            // The ApiException status code indicates the detailed failure reason.
            // Please refer to the GoogleSignInStatusCodes class reference for more information.
            Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
            updateUI(null);
        }
    }

    אפשר גם לקבל את כתובת האימייל של המשתמש באמצעות getEmail, את מזהה Google של המשתמש (לשימוש בצד הלקוח) באמצעות getId ואת אסימון המזהה של המשתמש באמצעות getIdToken. אם אתם צריכים להעביר את המשתמש שמחובר כרגע לשרת לקצה העורפי, שלחו את אסימון המזהה לשרת הקצה העורפי ואימתו את הטוקן בשרת.