شما میتوانید با ادغام ورود عمومی مبتنی بر وب OAuth در برنامه خود با استفاده از Firebase SDK، به کاربران خود اجازه دهید تا با استفاده از ارائهدهندگان OAuth مانند یاهو، با Firebase احراز هویت کنند تا جریان ورود به سیستم سرتاسری را انجام دهند.
قبل از اینکه شروع کنی
برای ورود کاربران با استفاده از حسابهای یاهو، ابتدا باید یاهو را به عنوان ارائهدهنده ورود به سیستم برای پروژه Firebase خود فعال کنید:
- در کنسول Firebase ، بخش Auth را باز کنید.
- در برگه «روش ورود» ، ارائهدهنده یاهو را فعال کنید.
- شناسه کلاینت و راز کلاینت را از کنسول توسعهدهنده آن ارائهدهنده به پیکربندی ارائهدهنده اضافه کنید:
برای ثبت یک کلاینت Yahoo OAuth، مستندات توسعهدهندهی Yahoo در مورد ثبت یک برنامهی وب با Yahoo را دنبال کنید.
حتماً دو مجوز OpenID Connect API را انتخاب کنید:
profileوemail.- هنگام ثبت برنامهها در این ارائهدهندگان، حتماً دامنه
*.firebaseapp.comرا برای پروژه خود به عنوان دامنه تغییر مسیر برای برنامه خود ثبت کنید.
- روی ذخیره کلیک کنید.
اگر هنوز اثر انگشت SHA-1 برنامه خود را مشخص نکردهاید، این کار را از صفحه تنظیمات کنسول Firebase انجام دهید. برای جزئیات بیشتر در مورد نحوه دریافت اثر انگشت SHA-1 برنامه خود، به بخش احراز هویت کلاینت خود مراجعه کنید.
مدیریت جریان ورود به سیستم با Firebase SDK
اگر در حال ساخت یک برنامه اندروید هستید، سادهترین راه برای احراز هویت کاربران با فایربیس و استفاده از حسابهای یاهو، مدیریت کل جریان ورود به سیستم با استفاده از کیت توسعه نرمافزار اندروید فایربیس است.
برای مدیریت جریان ورود به سیستم با استفاده از Firebase Android 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. } });
مراحل بعدی
پس از اینکه کاربر برای اولین بار وارد سیستم میشود، یک حساب کاربری جدید ایجاد میشود و به اطلاعات احراز هویت - یعنی نام کاربری و رمز عبور، شماره تلفن یا اطلاعات ارائه دهنده مجوز - که کاربر با آن وارد سیستم شده است، پیوند داده میشود. این حساب جدید به عنوان بخشی از پروژه Firebase شما ذخیره میشود و میتواند برای شناسایی کاربر در هر برنامه در پروژه شما، صرف نظر از نحوه ورود کاربر، مورد استفاده قرار گیرد.
در برنامههای خود، میتوانید اطلاعات اولیه پروفایل کاربر را از شیء
FirebaseUserدریافت کنید. به مدیریت کاربران مراجعه کنید.در قوانین امنیتی پایگاه داده و Cloud Storage Firebase Realtime Database ، میتوانید شناسه کاربری منحصر به فرد کاربر وارد شده را از متغیر
authدریافت کنید و از آن برای کنترل دادههایی که کاربر میتواند به آنها دسترسی داشته باشد، استفاده کنید.
برای خروج کاربر، signOut را فراخوانی کنید:
Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();