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

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

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

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

הגדרת 'כניסה באמצעות חשבון Google' והאובייקט GoogleSignInClient

  1. בשיטה onCreate של פעילות הכניסה, מגדירים את הכניסה באמצעות חשבון Google כך שיבקשו את נתוני המשתמשים שנדרשים לאפליקציה. לדוגמה, כדי להגדיר כניסה באמצעות חשבון Google על מנת לבקש את המזהה של המשתמשים ופרטי הפרופיל הבסיסיים, יוצרים אובייקט 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. תמונה של בורר החשבונות לכניסה ב-method onClick של הפעילות, צריך לטפל בהקשה על לחצני הכניסה. לשם כך, יוצרים Intent כניסה בשיטה getSignInIntent, ומתחילים את ה-Intent ב-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);
    }

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

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