Firebase Auth مابعد تسجيل الدخول
الحصول على معلومات المستخدم عبر Facebook و Google
شرحنا سابقاً عن كيفية تسجيل الدخول في 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
}
///......
}
}
التعليقات (0)
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !