میتوانید با ادغام «ورود به سیستم OAuth عمومی» مبتنی بر وب در برنامهتان بااستفاده از «کیت توسعه نرمافزار Firebase»، به کاربران اجازه دهید بااستفاده از ارائهدهندگان OAuth مثل Microsoft Azure Active Directory با Firebase اصالتسنجی کنند تا جریان ورود به سیستم سرتاسری را انجام دهند.
قبل از شروع
برای ورود به سیستم کاربران بااستفاده از حسابهای Microsoft (حسابهای Azure Active Directory و شخصی Microsoft)، ابتدا باید Microsoft را بهعنوان ارائهدهنده ورود به سیستم برای پروژه Firebase خود فعال کنید:
- در کنسول Firebase، به امنیت > اصالتسنجی بروید.
- در زبانه روش ورود به سیستم، ارائهدهنده ورود به سیستم Microsoft را فعال کنید.
-
شناسه کارخواه و رمز کارخواه را از کنسول توسعهدهنده آن ارائهدهنده به پیکربندی ارائهدهنده اضافه کنید:
- برای ثبت کارخواه Microsoft OAuth، دستورالعملهای شروع سریع: ثبت برنامه با نقطه پایان Azure Active Directory v2.0 را دنبال کنید. توجه داشته باشید که این نقطه پایانی از ورود به سیستم بااستفاده از حسابهای شخصی Microsoft و همچنین حسابهای Azure Active Directory پشتیبانی میکند. درباره Azure Active Directory v2.0 بیشتر بدانید.
-
هنگام ثبت برنامهها با این ارائهدهندگان، حتماً
دامنه
*.firebaseapp.comرا برای پروژه خود بهعنوان دامنه هدایت مجدد برای برنامه خود ثبت کنید.
- روی ذخیره کردن کلیک کنید.
اگر قبلاً اثر انگشت SHA-1 برنامهتان را مشخص نکردهاید، آن را مشخص کنید.
در کنسول Firebase، به
تنظیمات > زبانه کلی بروید.به کارت برنامههای شما پیمایش کنید، برنامه Android خود را انتخاب کنید، و اثر انگشت SHA-1 خود را در فیلد اثر انگشتهای گواهینامه SHA اضافه کنید.
برای جزئیات مربوط به نحوه دریافت اثر انگشت SHA برنامه، به اصالتسنجی مشتری مراجعه کنید.
مدیریت جریان ورود به سیستم با «کیت توسعه نرمافزار Firebase»
اگر درحال ساختن برنامه Android هستید، سادهترین راه برای اصالتسنجی کاربران با Firebase بااستفاده از حسابهای Microsoft آنها این است که کل جریان ورود به سیستم را با «کیت توسعه نرمافزار Firebase Android» مدیریت کنید.
برای مدیریت جریان ورود به سیستم با «کیت توسعه نرمافزار Firebase Android»، این مراحل را دنبال کنید:
بااستفاده از سازنده آن، نمونهای از OAuthProvider را با شناسه ارائهدهنده microsoft.com بسازید.
Kotlin
val provider = OAuthProvider.newBuilder("microsoft.ctivity.kt
Java
OAuthProvider.Builder provider = OAuthProvider.newBuilder("microsoft.civity.java
اختیاری: پارامترهای سفارشی OAuth اضافی را که میخواهید با درخواست OAuth ارسال کنید مشخص کنید.
Kotlin
// Target specific email with login hint. // Force re-consent. provider.addCustomParameter("prompt", "consent") // Target specific email with login hint. provider.addCustomParameter("login_hint", &qicrosoft.com")GenericIdpActivity.kt
Java
// Target specific email with login hint. // Force re-consent. provider.addCustomParameter("prompt", "consent"); // Target specific email with login hint. provider.addCustomParameter("login_hint", &quosoft.com");GenericIdpActivity.java
برای پارامترهایی که Microsoft پشتیبانی میکند، به مستندات Microsoft OAuth مراجعه کنید. توجه داشته باشید که نمیتوانید پارامترهای الزامی Firebase را با
setCustomParameters()ارسال کنید. این پارامترها عبارتاند از client_id، response_type، redirect_uri، state، scope، و response_mode.برای اینکه فقط کاربران یک مستأجر Azure AD خاص بتوانند به سیستم برنامه وارد شوند، میتوان از نام دامنه آشنای مستأجر Azure AD یا شناسه GUID مستأجر استفاده کرد. این کار را میتوانید با مشخص کردن فیلد «مستأجر» در شیء پارامترهای سفارشی انجام دهید.
Kotlin
// 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". prover("tenant", "TENANT_ID")GenericIdpActivity.kt
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". provi"tenant", "TENANT_ID");GenericIdpActivity.java
اختیاری: حوزههای OAuth 2.0 اضافی را فراتر از نمایه پایه که میخواهید از ارائهدهنده اصالتسنجی درخواست کنید مشخص کنید.
Kotlin
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. provider.scopes = listOf("mail.read",")GenericIdpActivity.kt
Java
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissio<ns. Li>stString scopes = new A<rrayLi>stString() { { add("mail.read"); add("calendars.read"); } };pes);GenericIdpActivity.java
برای کسب اطلاعات بیشتر، به مستندات اجازهها و موافقت Microsoft مراجعه کنید.
بااستفاده از شیء ارائهدهنده OAuth، با Firebase اصالتسنجی کنید. توجه داشته باشید که برخلاف دیگر عملیات FirebaseAuth، این عملیات با بالا آوردن برگه سفارشی Chrome کنترل واسط کاربر شما را دراختیار میگیرد. درنتیجه، به «فعالیت» خود در
OnSuccessListenerوOnFailureListenerکه پیوست میکنید ارجاع ندهید زیرا وقتی عملکرد رابط کاربری شروع میشود، بلافاصله جدا میشوند.ابتدا باید بررسی کنید که قبلاً پاسخی دریافت کردهاید یا نه. ورود به سیستم ازطریق این روش «فعالیت» شما را در پسزمینه قرار میدهد، به این معنی که سیستم میتواند آن را درطول جریان ورود به سیستم پس بگیرد. برای اینکه مطمئن شوید اگر این اتفاق افتاد کاربر را مجبور به تلاش مجدد نمیکنید، باید بررسی کنید که آیا نتیجهای ازقبل وجود دارد یا نه.
برای بررسی اینکه نتیجه معلقی وجود دارد یا نه، با
getPendingAuthResultتماس بگیرید:Kotlin
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 ivity.kt
Java
Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult(); if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener( new OnSuccessList<enerAuthRe>sult() { @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 ity.java
برای شروع جریان ورود به سیستم،
startActivityForSignInWithProviderرا فراخوانی کنید:Kotlin
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» پشتیبانی میکند، Microsoft نشانی وب عکس ارائه نمیدهد و درعوض، دادههای باینری عکس نمایه باید ازطریق Microsoft Graph API درخواست شود.
علاوهبر کد دسترسی OAuth، کد شناسایی کاربر OAuth نیز میتواند از شیء
OAuthCredentialبازیابی شود. ادعایsubدر کد شناسایی مختص برنامه است و با شناسه کاربر فدرال که توسط «احراز هویت Firebase» استفاده میشود و ازطریقuser.getProviderData().get(0).getUid()دردسترس است مطابقت نخواهد داشت. بهجای آن باید از فیلد ادعایoidاستفاده شود. هنگام استفاده از مستأجر Azure AD برای ورود به سیستم، ادعایoidمطابقت دقیق خواهد داشت. بااینحال، برای مورد غیرمستأجر، فیلدoidتکمیل میشود. برای شناسه فدرال4b2eabcdefghijkl،oidفرم00000000-0000-0000-4b2e-abcdefghijklرا خواهد داشت.اگرچه مثالهای بالا بر جریانهای ورود به سیستم تمرکز دارند، شما همچنین این امکان را دارید که بااستفاده از
startActivityForLinkWithProviderارائهدهنده Microsoft را به کاربر موجود پیوند دهید. برای مثال، میتوانید چندین ارائهدهنده را به یک کاربر پیوند دهید و به او اجازه دهید با هرکدام از آنها وارد سیستم شود.Kotlin
// 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
// 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 Database و Cloud Storage قوانین امنیتی، میتوانید شناسه کاربر یکتای کاربر واردشده به سیستم را از متغیر
authدریافت کنید و از آن برای کنترل دادههایی که کاربر میتواند به آنها دسترسی داشته باشد استفاده کنید.
میتوانید به کاربران اجازه دهید با پیوند دادن اطلاعات اعتباری ارائهدهنده اصالتسنجی به حساب کاربری موجود بااستفاده از چندین ارائهدهنده اصالتسنجی به سیستم برنامهتان وارد شوند.
برای خروج از سیستم کاربر،
signOut را فراخوانی کنید:
Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();