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