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

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

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

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

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

  1. ב-method onCreate של פעילות הכניסה, מגדירים את Google'כניסה באמצעות חשבון 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. לאחר מכן, ב-method onCreate של פעילות הכניסה, יוצרים אובייקט GoogleSignInClient עם האפשרויות שציינתם.

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

חיפוש משתמש מחובר קיים

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