شما میتوانید با ادغام ورود عمومی مبتنی بر وب OAuth در برنامه خود با استفاده از Firebase SDK، به کاربران خود اجازه دهید تا با استفاده از ارائهدهندگان OAuth مانند یاهو، با Firebase ا��راز هویت ��نند تا جریان ورود به سیستم سرتاسری را انجام دهند.
قبل از اینکه شروع کنی
برای ورود کاربران با استفاده از حسابهای یاهو، ابتدا باید یاهو را به عنوان ارائهدهنده ورود به سیستم برای پروژه Firebase خود فعال کنید:
- در کنسول Firebase ، به بخش امنیت > احراز هویت بروید.
- در تب روش ورود ، ارائه دهنده ورود یاهو را فعال ک��ید.
- شناسه کلاینت و راز کلاینت را از کنسول توسعهدهنده آن ارائهدهنده به پیکربندی ارائهدهنده اضافه کنید:
برای ثبت یک کلاینت Yahoo OAuth، مستندات توسعهدهندهی Yahoo در مورد ثبت یک برنامهی وب با Yahoo را دنبال کنید.
حتماً دو مجوز OpenID Connect API را انتخاب کنید:
profileوemail.- هنگام ثبت برنامهها در این ارائهدهندگان، حتماً دامنه
*.firebaseapp.comرا برای پروژه خود به عنوان دامنه تغییر مسیر برای برنامه خود ثبت کنید.
- روی ذخیره کلیک کنید.
اگر قبلاً اثر انگشت SHA-1 برنامه خود را مشخص نکردهاید، آن را مشخص کنید.
در کنسول Firebase ، به مسیر زیر بروید:
> برگه عمومی . به پایین صفحه و قسمت «برنامههای شما» بروید، برنامه اندروید خود را انتخاب کنید و اثر انگشت SHA-1 خود را در قسمت «اثر انگشت گواهی SHA» اضافه کنید.
برای جزئیات بیشتر در مورد نحوه دریافت اثر انگشت SHA برنامه خود، به بخش احراز هویت کلاینت خود م��اجعه کنید.
مدیریت جریان ورود به سیستم با Firebase SDK
با استفاده از سازندهی OAuthProvider و با شناسهی ارائهدهندهی yahoo.com ، یک نمونه از آن بسازید. Kotlin
val provider = OAuthProvider.newBuilder("yahoo.com")
Java
OAuthProvider.Builder provider = OAuthProvider.newBuilder("yahoo.com");
اختیاری : پارامترهای سفارشی اضافی OAuth را که میخواهید با درخواست OAuth ارسال کنید، مشخص کنید. Kotlin
// Prompt user to re-authenticate to Yahoo. provider.addCustomParameter("prompt", "login") // Localize to French. provider.addCustomParameter("language", "fr")
Java
// Prompt user to re-authenticate to Yahoo. provider.addCustomParameter("prompt", "login"); // Localize to French. provider.addCustomParameter("language", "fr");
برای پارامترهایی که یاهو پشتیبانی میکند، به مستندات OAuth یاهو مراجعه کنید. توجه داشته باشید که نمیتوانید پارامترهای مورد نیاز Firebase را با setCustomParameters()ارسال کنید. این پارامترها client_id ، redirect_uri ، response_type ، scope و state هستند.اختیاری : حوزههای OAuth 2.0 اضافی فراتر از profileوemailرا که میخواهید از ارائهدهنده احراز هویت درخواست کنید، مشخص کنید. اگر برنامه شما نیاز به دسترسی به دادههای خصوصی کاربر از APIهای یاهو دارد، باید در بخش مجوزهای API در کنسول توسعهدهنده یاهو، مجوزهای APIهای یاهو را درخواست کنید. حوزههای OAuth درخواستی باید دقیقاً با موارد از پیش پیکربندیشده در مجوزهای API برنامه مطابقت داشته باشند. به عنوان مثال، اگر دسترسی خواندن/نوشتن به مخاطبین کاربر درخواست شده و در مجوزهای API برنامه از پیش پیکربندی شده باشد، باید به جای حوزه OAuth فقط خواندنیsdct-r،sdct-wارسال شود. در غیر این صورت، روند کار با شکست مواجه میشود و خطایی به کاربر نهایی نشان داده میشود.Kotlin
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. provider.scopes = listOf("mail-r", "sdct-w")
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>() { { // Request access to Yahoo Mail API. add("mail-r"); // This must be preconfigured in the app's API permissions. add("sdct-w"); } }; provider.setScopes(scopes);
با استفاده از شیء ارائه دهنده OAuth، با Firebase احراز هویت کنید. توجه داشته باشید که برخلاف سایر عملیات FirebaseAuth، این عملیات با نمایش یک تب سفارشی کروم ، کنترل رابط کاربری شما را به دست میگیرد. در نتیجه، در OnSuccessListeners و OnFailureListeners که پیوست میکنید، به Activity خود ارجاع ندهید زیرا آنها بلافاصله پس از شروع عملیات در رابط کاربری جدا میشوند. ابتدا باید بررسی کنید که آیا قبلاً پاسخی دریافت کردهاید یا خیر. ورود به سیستم از طریق این روش، Activity شما را در پسزمینه قرار میدهد، به این معنی که سیستم میتواند در طول جریان ورود، آن را بازیابی کند. برای اطمینان از اینکه در صورت بروز این اتفاق، کاربر را مجبور به تلاش مجدد نکنید، باید بررسی کنید که آیا نتیجهای از قبل وجود دارد یا خیر. برای بررسی اینکه آیا نتیجهای در انتظار است یا خیر، 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 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
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، میتوانید API یاهو را فراخوانی کنید. که در آن YAHOO_USER_UIDشناسه کاربر یاهو است که میتواند از فیلدfirebaseAuth.getCurrentUser().getProviderData().get(0).getUid()یا ازauthResult.getAdditionalUserInfo().getProfile()و تحلیل شود.در حالی که مثالهای بالا بر جریانهای ورود به سیستم تمرکز دارند، شما همچنین میتوانید با استفاده از startActivityForLinkWithProvider، یک ارائهدهنده یاهو را به یک کاربر موجود پیوند دهید. به عنوان مثال، میتوانید چندین ارائهدهنده را به یک کاربر پیوند دهید و به آنها اجازه دهید با هر یک از آنها وارد سیستم شوند.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. } });
مراحل بعدی
در برنامههای خود، میتوانید اطلاعات اولیه پروفایل کاربر را از شیء FirebaseUserدریافت کنید. به مدیریت کاربران مراجعه کنید.در قوانین امنیتی پایگاه داده و Cloud Storage Firebase Realtime Database ، میتوانید شناسه کاربری منحصر به فرد کاربر وارد شده را از متغیر authدریافت کنید و از آن برای کنترل دادههایی که کاربر میتواند به آنها دسترسی داشته باشد، استفاده کنید.
signOut را فراخوانی کنید:
Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();