Firebase Auth مابعد تسجيل الدخول

الحصول على معلومات المستخدم عبر Facebook و Google

AbdulAlim Rajjoubمنذ سنة

شرحنا سابقاً عن كيفية تسجيل الدخول في Firebase 

مقدمة الى Firebase Authentication | تسجيل الدخول باستخدام البريد الإلكتروني و Anonymous Login

Firebase Authentication | تسجيل الدخول باستخدام حساب فيسبوك

Firebase Authentication | تسجيل الدخول باستخدام حساب Google

 

سنقوم بهذا الدرس بشرح بعض الأشياء التي يمكننا فعلها بعد تسجيل الدخول ,كالحصول على اسم المستخدم وصورته من فيس بوك او Google ...
 

سنقوم بأخذ نفس الأكواد التي استخدمناها في الدروس السابقة بالإضافة لبعض التعديلات,لهذا تأكد أنك قد قمت بقراءة المقالات السابقة أولاً.

 

كيفية الحصول على معلومات المستخدم في حساب جوجل

سنأخذ اسم المستخدم بالإضافة الى صورته الشخصية 

بهذا الشكل

ونلاحظ أنه قمنا بإضافة السطر .requestProfile() لأخذ الصلاحية من المستخدم بالحصول على اسمه وصورته

        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken("YOUR_KEY")
                .requestEmail()
                .requestProfile()//getting user info
                .build();

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this, new GoogleApiClient.OnConnectionFailedListener() {
                    @Override
                    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
                    }
                } /* OnConnectionFailedListener */)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();

وعند الضغط على زر تسجيل الدخول نقوم بتسجيل الدخول

 private void googleSignIn() {
        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }

 

        btnGoogleLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                googleSignIn();
            }
        });

ثم نتلقى نتيجة تسجيل الدخول في onActivityResult

اذا تمت العملية بنجاح فسنقوم بتعريف GoogleSignAccount وهو الكلاس الذي يحتوي على معلومات المستخدم مثل اسمه الكامل,صورته الشخصية, اسم العائلة الخ..

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            Log.d("3llomi", String.valueOf(result.getStatus()));
            if (result.isSuccess()) {
                //getting user account 
                GoogleSignInAccount account = result.getSignInAccount();

                String photoUrl = account.getPhotoUrl() + "";
                String userName = account.getDisplayName();
                
              

                // Google Sign In was successful, authenticate with Firebase
                firebaseAuthWithGoogle(account);
            } else {
                // Google Sign In failed
            }
        }
    }

 

الحصول على معلومات مستخدم الفيس بوك

سنقوم بفعل نفس الشيئ بالنسبة للفيس بوك

ونلاحظ هنا أنه قمنا بإضافة الصلاحية public_profile للحصول على صورة المستخدم

        btnFacebookLogin.setReadPermissions("email", "public_profile");

وعند نجاح عملية تسجيل الدخول  نقوم بأخذ الUserId ثم نستخدم Facebook Graph API للحصول على رابط الصورة

حيث أن 500 هي حجم الصورة يمكنك وضع الحجم الذي تريد

        btnFacebookLogin.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                String userId = loginResult.getAccessToken().getUserId();
                String photoUrl = "https://graph.facebook.com/" + userId + "/picture?height=500";


                Log.d("3llomi", "photo url is " + photoUrl);

                handleFacebookAccessToken(loginResult.getAccessToken());
            }

            @Override
            public void onCancel() {

            }

            @Override
            public void onError(FacebookException error) {

            }
        });

أما اذا اردنا أخذ اسم المستخدم وبعض المعلومات الخاصة ك تاريخ الميلاد والبلد والخ..

فيجب علينا إرسال طلب Request الى Facebook Graph API الذي يعيد JSON 

نقوم بإنشاء GraphRequest ونعطيه الaccessToken وعند نجاح العملية سنكتفي حالياً بطباعة response في logcat لنرى شكلها

GraphRequest request = GraphRequest.newMeRequest(
                        loginResult.getAccessToken(),
                        new GraphRequest.GraphJSONObjectCallback() {
                            @Override
                            public void onCompleted(JSONObject object, GraphResponse response) {
                                Log.d("3llomi", "Graph API Response " + response.toString());
                            }
                        });

ثم نقوم بوضع المعلومات التي نريد أخذها ,ونضعها ك بارامترز في Bundle (يمكنك معرفة هذه الkeys في هذا الرابط)

هنا طلبنا فقط الإسم وجنس المستخدم 

ثم قمنا بإعطاء هذه البارامترز لrequest وقمنا ببدء الطلب 

Bundle parameters = new Bundle();
                parameters.putString("fields", "name,gender");
                request.setParameters(parameters);
                request.executeAsync();

نذهب ل logcat لنرى الresponse

أما الآن نريد استخراج اسم المستخدم والجنس من هذا JSON

وقمنا بعمل try catch في حال وجود أخطاء في json 

 GraphRequest request = GraphRequest.newMeRequest(
                        loginResult.getAccessToken(),
                        new GraphRequest.GraphJSONObjectCallback() {
                            @Override
                            public void onCompleted(JSONObject object, GraphResponse response) {
                                Log.d("3llomi", "Graph API Response " + response.toString());

                                try {

                                    String name = object.getString("name");
                                    String gender = object.getString("gender");
                                    Log.d("3llomi", "name is " + name + " gender is " + gender);
                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }

                            }
                        });
               

 

معرفة نوع المستخدم 

في بعض الأحيان نحتاج أن نعرف هل قام المستخدم بتسجيل الدخول عبر Facebook أم عبر Google او Twitter الخ.. فكما نعلم فإن Firebase تدعم تسجيل الدخول عبر خدمات متعددة

بدايةً نقوم بالتأكد من أن FirebaseAuth ليست null وأن المستخدم قام بتسجيل الدخول getCurrentUser!=null 

ثم نقوم بعمل for loop على providerData 

ونقوم بالتأكد اذا كان providerId هو facebook.com فإن المستخدم قام بتسجيل الدخول عبر Facebook ,ونفس الموضوع بالنسبة ل google و twitter...

 

  if (mAuth != null && mAuth.getCurrentUser() != null) {
            for (UserInfo profile : mAuth.getCurrentUser().getProviderData()) {
                String providerId = profile.getProviderId();
                Log.d("3llomi", "current providerId " + providerId);
                if (providerId.equals("facebook.com")){
                    //A Facebook User
                }
                else if (providerId.equals("google.com")){
                    //A Google User
                }
                else if (providerId.equals("twitter.com")){
                    //A Twitter User
                }
                
                ///......

            }

        }

 

1
إعجاب
894
مشاهدات
0
مشاركة
1
متابع

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !