يمكنك السماح للمستخدمين بالمصادقة مع Firebase باستخدام موفري OAuth مثل Microsoft Azure Active Directory من خلال دمج تسجيل دخول OAuth العام المستند إلى الويب في تطبيقك باستخدام Firebase SDK لتنفيذ تدفق تسجيل الدخول الشامل.
قبل ان تبدأ
لتسجيل دخول المستخدمين باستخدام حسابات Microsoft (Azure Active Directory وحسابات Microsoft الشخصية)، يجب عليك أولاً تمكين Microsoft كموفر تسجيل دخول لمشروع Firebase الخاص بك:
- في وحدة تحكم Firebase ، افتح قسم المصادقة .
- في علامة التبويب طريقة تسجيل الدخول ، قم بتمكين موفر Microsoft .
- أضف معرف العميل وسر العميل من وحدة تحكم المطور الخاصة بهذا الموفر إلى تكوين الموفر:
- لتسجيل عميل Microsoft OAuth، اتبع الإرشادات الموجودة في Quickstart: قم بتسجيل تطبيق باستخدام نقطة نهاية Azure Active Directory v2.0 . لاحظ أن نقطة النهاية هذه تدعم تسجيل الدخول باستخدام حسابات Microsoft الشخصية بالإضافة إلى حسابات Azure Active Directory. تعرف على المزيد حول Azure Active Directory v2.0.
- عند تسجيل التطبيقات مع هؤلاء الموفرين، تأكد من تسجيل النطاق
*.firebaseapp.com
لمشروعك باعتباره مجال إعادة التوجيه لتطبيقك.
- انقر فوق حفظ .
إذا لم تكن قد حددت بعد بصمة SHA-1 لتطبيقك، فقم بذلك من صفحة الإعدادات في وحدة تحكم Firebase. ارجع إلى مصادقة عميلك للحصول على تفاصيل حول كيفية الحصول على بصمة SHA-1 لتطبيقك.
تعامل مع تدفق تسجيل الدخول باستخدام Firebase SDK
إذا كنت تقوم بإنشاء تطبيق Android، فإن أسهل طريقة لمصادقة المستخدمين لديك باستخدام Firebase باستخدام حسابات Microsoft الخاصة بهم هي التعامل مع تدفق تسجيل الدخول بالكامل باستخدام Firebase Android SDK.
للتعامل مع تدفق تسجيل الدخول باستخدام Firebase Android SDK، اتبع الخطوات التالية:
قم بإنشاء مثيل لـ OAuthProvider باستخدام منشئه بمعرف الموفر microsoft.com .
Kotlin+KTX
val provider = OAuthProvider.newBuilder("microsoft.com")
Java
OAuthProvider.Builder provider = OAuthProvider.newBuilder("microsoft.com");
اختياري : حدد معلمات OAuth المخصصة الإضافية التي تريد إرسالها مع طلب OAuth.
Kotlin+KTX
// Target specific email with login hint. // Force re-consent. provider.addCustomParameter("prompt", "consent") // Target specific email with login hint. provider.addCustomParameter("login_hint", "user@firstadd.onmicrosoft.com")
Java
// Target specific email with login hint. // Force re-consent. provider.addCustomParameter("prompt", "consent"); // Target specific email with login hint. provider.addCustomParameter("login_hint", "user@firstadd.onmicrosoft.com");
للتعرف على المعلمات التي تدعمها Microsoft، راجع وثائق Microsoft OAuth . لاحظ أنه لا يمكنك تمرير المعلمات المطلوبة لـ Firebase باستخدام
setCustomParameters()
. هذه المعلمات هي Client_id و response_type و redirect_uri والحالة والنطاق و response_mode .للسماح فقط للمستخدمين من مستأجر Azure AD معين بتسجيل الدخول إلى التطبيق، يمكن استخدام إما اسم المجال المألوف لمستأجر Azure AD أو معرف GUID الخاص بالمستأجر. يمكن القيام بذلك عن طريق تحديد حقل "المستأجر" في كائن المعلمات المخصصة.
Kotlin+KTX
// Optional "tenant" parameter in case you are using an Azure AD tenant. // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com' // or "common" for tenant-independent tokens. // The default value is "common". provider.addCustomParameter("tenant", "TENANT_ID")
Java
// Optional "tenant" parameter in case you are using an Azure AD tenant. // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com' // or "common" for tenant-independent tokens. // The default value is "common". provider.addCustomParameter("tenant", "TENANT_ID");
اختياري : حدد نطاقات OAuth 2.0 الإضافية خارج ملف التعريف الأساسي الذي تريد طلبه من موفر المصادقة.
Kotlin+KTX
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. provider.scopes = listOf("mail.read", "calendars.read")
Java
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. List<String> scopes = new ArrayList<String>() { { add("mail.read"); add("calendars.read"); } }; provider.setScopes(scopes);
لمعرفة المزيد، راجع أذونات Microsoft ووثائق الموافقة .
قم بالمصادقة مع Firebase باستخدام كائن موفر OAuth. لاحظ أنه على عكس عمليات FirebaseAuth الأخرى، سيتحكم هذا في واجهة المستخدم الخاصة بك عن طريق ظهور علامة تبويب Chrome مخصصة . ونتيجة لذلك، لا تقم بالإشارة إلى نشاطك في
OnSuccessListener
وOnFailureListener
اللذين قمت بإرفاقهما حيث سيتم فصلهما على الفور عندما تبدأ العملية في واجهة المستخدم.يجب عليك أولاً التحقق مما إذا كنت قد تلقيت ردًا بالفعل. يؤدي تسجيل الدخول عبر هذه الطريقة إلى وضع نشاطك في الخلفية، مما يعني أنه يمكن للنظام استعادته أثناء تدفق تسجيل الدخول. للتأكد من أنك لا تجعل المستخدم يحاول مرة أخرى في حالة حدوث ذلك، يجب عليك التحقق مما إذا كانت النتيجة موجودة بالفعل.
للتحقق مما إذا كانت هناك نتيجة معلقة، اتصل بـ
getPendingAuthResult
:Kotlin+KTX
val pendingResultTask = firebaseAuth.pendingAuthResult if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. } } else { // There's no pending result so you need to start the sign-in flow. // See below. }
Java
Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult(); if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } }); } else { // There's no pending result so you need to start the sign-in flow. // See below. }
لبدء تدفق تسجيل الدخول، اتصل بـ
startActivityForSignInWithProvider
:Kotlin+KTX
firebaseAuth .startActivityForSignInWithProvider(activity, provider.build()) .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. }
Java
firebaseAuth .startActivityForSignInWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
عند الانتهاء بنجاح، يمكن استرداد رمز وصول OAuth المرتبط بالموفر من كائن
OAuthCredential
الذي تم إرجاعه.باستخدام رمز وصول OAuth، يمكنك الاتصال بـ Microsoft Graph API .
على عكس موفري الخدمة الآخرين الذين تدعمهم Firebase Auth، لا توفر Microsoft عنوان URL للصورة وبدلاً من ذلك، يجب طلب البيانات الثنائية لصورة الملف الشخصي عبر Microsoft Graph API .
بالإضافة إلى رمز وصول OAuth، يمكن أيضًا استرداد رمز OAuth ID المميز للمستخدم من كائن
OAuthCredential
. المطالبةsub
في الرمز المميز للمعرف خاصة بالتطبيق ولن تتطابق مع معرف المستخدم الموحد الذي تستخدمه Firebase Auth ويمكن الوصول إليه عبرuser.getProviderData().get(0).getUid()
. يجب استخدام حقل مطالبةoid
بدلاً من ذلك. عند استخدام مستأجر Azure AD لتسجيل الدخول، ستكون مطالبةoid
متطابقة تمامًا. ومع ذلك، بالنسبة لحالة غير المستأجر، يكون حقلoid
مبطنًا. بالنسبة للمعرف الموحد4b2eabcdefghijkl
، سيكونoid
الشكل00000000-0000-0000-4b2e-abcdefghijkl
.بينما تركز الأمثلة المذكورة أعلاه على تدفقات تسجيل الدخول، لديك أيضًا القدرة على ربط موفر Microsoft بمستخدم حالي باستخدام
startActivityForLinkWithProvider
. على سبيل المثال، يمكنك ربط عدة موفري خدمات بنفس المستخدم مما يسمح لهم بتسجيل الدخول باستخدام أي منهما.Kotlin+KTX
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForLinkWithProvider(activity, provider.build()) .addOnSuccessListener { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForLinkWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
يمكن استخدام نفس النمط مع
startActivityForReauthenticateWithProvider
والذي يمكن استخدامه لاسترداد بيانات اعتماد جديدة للعمليات الحساسة التي تتطلب تسجيل دخول مؤخرًا.Kotlin+KTX
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForReauthenticateWithProvider(activity, provider.build()) .addOnSuccessListener { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
الخطوات التالية
بعد قيام المستخدم بتسجيل الدخول لأول مرة، يتم إنشاء حساب مستخدم جديد وربطه ببيانات الاعتماد - أي اسم المستخدم وكلمة المرور أو رقم الهاتف أو معلومات موفر المصادقة - التي قام المستخدم بتسجيل الدخول بها. يتم تخزين هذا الحساب الجديد كجزء من مشروع Firebase الخاص بك، ويمكن استخدامه لتحديد المستخدم عبر كل تطبيق في مشروعك، بغض النظر عن كيفية تسجيل دخول المستخدم.
في تطبيقاتك، يمكنك الحصول على معلومات الملف الشخصي الأساسية للمستخدم من كائن
FirebaseUser
. راجع إدارة المستخدمين .في قاعدة بيانات Firebase Realtime وقواعد أمان التخزين السحابي، يمكنك الحصول على معرف المستخدم الفريد للمستخدم الذي قام بتسجيل الدخول من متغير
auth
، واستخدامه للتحكم في البيانات التي يمكن للمستخدم الوصول إليها.
يمكنك السماح للمستخدمين بتسجيل الدخول إلى تطبيقك باستخدام موفري مصادقة متعددين عن طريق ربط بيانات اعتماد موفر المصادقة بحساب مستخدم موجود.
لتسجيل خروج مستخدم، اتصل signOut
:
Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();