دمج ميزة "تسجيل الدخول باستخدام حساب Google" في تطبيق Android

لدمج ميزة "تسجيل الدخول باستخدام حساب Google" في تطبيق Android، عليك ضبط إعدادات هذه الميزة وإضافة زر إلى تصميم تطبيقك لبدء عملية تسجيل الدخول.

قبل البدء

إعداد مشروع على Google Cloud Console وإعداد مشروعك على "استوديو Android"

ضبط ميزة "تسجيل الدخول باستخدام حساب 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 API، حدِّدها باستخدام requestScopes. لتقديم أفضل تجربة للمستخدم، لا تطلب عند تسجيل الدخول سوى النطاقات اللازمة لتشغيل تطبيقك بالحد الأدنى. لا تطلب أي نطاقات إضافية إلا عند الحاجة إليها، حتى يرى المستخدمون شاشة الموافقة في سياق إجراء نفّذوه. راجِع مقالة طلب نطاقات إضافية.

  2. بعد ذلك، أنشئ كائن GoogleSignInClient في طريقة onCreate الخاصة بنشاط تسجيل الدخول باستخدام الخيارات التي حدّدتها.

    // 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. زر أزرق عليه شعار G باللون الأبيض وعبارة "تسجيل الدخول باستخدام حساب 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. شاشة اختيار الحساب من Google تعرض قائمة بالحسابات التي يمكن اختيارها لتسجيل الدخول في طريقة 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. إذا كنت بحاجة إلى تمرير المستخدم الذي سجّل الدخول إلى خادم خلفية، أرسِل الرمز المميّز لتعريف الهوية إلى خادم الخلفية وتحقّق من صحة الرمز المميّز على الخادم.