شما میتوانید با ادغام ورود عمومی مبتنی بر وب OAuth در برنامه خود با استفاده از Firebase SDK، به کاربران خود اجازه دهید تا با استفاده از ارائهدهندگان OAuth مانند Microsoft Azure Active Directory، احراز هویت خود را با Firebase انجام دهند تا جریان ورود به سیستم سرتاسری را انجام دهند.
قبل از اینکه شروع کنی
برای ورود کاربران با استفاده از حسابهای مایکروسافت (Azure Active Directory و حسابهای شخصی مایکروسافت)، ابتدا باید مایکروسافت را به عنوان ارائهدهنده ورود به سیستم برای پروژه Firebase خود فعال کنید:
- فایربیس را به پروژه اپل خود اضافه کنید .
- در کنسول Firebase ، به بخش امنیت > احراز هویت بروید.
- در تب روش ورود ، ارائه دهنده ورود به سیستم مایکروسافت را فعال کنید.
- شناسه کلاینت و راز کلاینت را از کنسول توسعهدهنده آن ارائهدهنده به پیکربندی ارائهدهنده اضافه کنید:
- برای ثبت یک کلاینت Microsoft OAuth، دستورالعملهای موجود در Quickstart را دنبال کنید: یک برنامه را با نقطه پایانی Azure Active Directory v2.0 ثبت کنید . توجه داشته باشید که این نقطه پایانی از ورود به سیستم با استفاده از حسابهای شخصی مایکروسافت و همچنین حسابهای Azure Active Directory پشتیبانی میکند. درباره Azure Active Directory v2.0 بیشتر بدانید.
- هنگام ثبت برنامهها در این ارائهدهندگان، حتماً دامنه
*.firebaseapp.comرا برای پروژه خود به عنوان دامنه تغییر مسیر برای برنامه خود ثبت کنید.
- روی ذخیره کلیک کنید.
مدیریت جریان ورود به سیستم با Firebase SDK
برای مدیریت جریان ورود به سیستم با SDK پلتفرمهای اپل فایربیس، این مراحل را دنبال کنید:
طرحهای URL سفارشی را به پروژه Xcode خود اضافه کنید:
- پیکربندی پروژه خود را باز کنید: روی نام پروژه در نمای درختی سمت چپ دوبار کلیک کنید. برنامه خود را از بخش TARGETS انتخاب کنید، سپس تب Info را انتخاب کنید و بخش URL Types را باز کنید.
- روی دکمه + کلیک کنید و شناسه برنامه رمزگذاری شده خود را به عنوان یک طرح URL اضافه کنید. سایر فیلدها را خالی بگذارید.
میتوانید شناسه برنامه رمزگذاری شده خود را در کنسول Firebase پیدا کنید: به
> برگه عمومی ، سپس به پایین صفحه بروید تا به بخش برنامههای شما برسید تا جزئیات مربوط به برنامه iOS خود را مشاهده کنید. پس از تکمیل، پیکربندی شما باید چیزی شبیه به موارد زیر باشد (اما با مقادیر خاص برنامه شما):

با استفاده از شناسه ارائه دهنده microsoft.com، یک نمونه از OAuthProvider ایجاد کنید.
سویفت
var provider = OAuthProvider(providerID: "microsoft.com")
هدف-سی
FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"microsoft.com"];
اختیاری : پارامترهای سفارشی اضافی OAuth را که میخواهید با درخواست OAuth ارسال کنید، مشخص کنید.
سویفت
provider.customParameters = [ "prompt": "consent", "login_hint": "user@firstadd.onmicrosoft.com" ]
هدف-سی
[provider setCustomParameters:@{@"prompt": @"consent", @"login_hint": @"user@firstadd.onmicrosoft.com"}];
برای پارامترهایی که مایکروسافت پشتیبانی میکند، به مستندات OAuth مایکروسافت مراجعه کنید. توجه داشته باشید که نمیتوانید پارامترهای مورد نیاز Firebase را با
setCustomParametersارسال کنید. این پارامترها عبارتند از client_id ، response_type ، redirect_uri ، state ، scope و response_mode .برای اینکه فقط کاربران یک مستاجر خاص Azure AD بتوانند وارد برنامه شوند، میتوان از نام دامنه آشنای مستاجر Azure AD یا شناسه GUID مستاجر استفاده کرد. این کار را میتوان با مشخص کردن فیلد "مستاجر" در شیء پارامترهای سفارشی انجام داد.
سویفت
provider.customParameters = [ // 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". "tenant": "TENANT_ID" ]
هدف-سی
// 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.customParameters = @{@"tenant": @"TENANT_ID"};
اختیاری : محدودههای اضافی OAuth 2.0 فراتر از پروفایل پایه که میخواهید از ارائهدهنده احراز هویت درخواست کنید را مشخص کنید.
سویفت
provider.scopes = ["mail.read", "calendars.read"]
هدف-سی
[provider setScopes:@[@"mail.read", @"calendars.read"]];
برای کسب اطلاعات بیشتر، به مستندات مجوزها و رضایتنامههای مایکروسافت مراجعه کنید.
اختیاری : اگر میخواهید نحوه نمایش
SFSafariViewControllerیاUIWebViewتوسط برنامه خود را هنگام نمایش reCAPTCHA به کاربر سفارشی کنید، یک کلاس سفارشی ایجاد کنید که با پروتکلAuthUIDelegateمطابقت داشته باشد و آن را بهcredentialWithUIDelegateمنتقل کنید.با استفاده از شیء ارائه دهنده OAuth، با Firebase احراز هویت کنید.
سویفت
// Replace nil with the custom class that conforms to AuthUIDelegate // you created in last step to use a customized web view. provider.getCredentialWith(nil) { credential, error in if error != nil { // Handle error. } if credential != nil { Auth().signIn(with: credential) { authResult, error in if error != nil { // Handle error. } // User is signed in. // IdP data available in authResult.additionalUserInfo.profile. // OAuth access token can also be retrieved: // (authResult.credential as? OAuthCredential)?.accessToken // OAuth ID token can also be retrieved: // (authResult.credential as? OAuthCredential)?.idToken } } }
هدف-سی
[provider getCredentialWithUIDelegate:nil completion:^(FIRAuthCredential *_Nullable credential, NSError *_Nullable error) { if (error) { // Handle error. } if (credential) { [[FIRAuth auth] signInWithCredential:credential completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { if (error) { // Handle error. } // User is signed in. // IdP data available in authResult.additionalUserInfo.profile. // OAuth access token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).accessToken // OAuth ID token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).idToken }]; } }];
با استفاده از توکن دسترسی OAuth، میتوانید Microsoft Graph API را فراخوانی کنید.
برای مثال، برای دریافت اطلاعات اولیه پروفایل، میتوانید REST API را فراخوانی کنید و توکن دسترسی را در هدر
Authorizationارسال کنید:https://graph.microsoft.com/v1.0/me
برخلاف سایر ارائهدهندگان پشتیبانیشده توسط Firebase Auth، مایکروسافت آدرس اینترنتی عکس ارائه نمیدهد و در عوض، دادههای دودویی برای عکس پروفایل باید از طریق Microsoft Graph API درخواست شوند.
علاوه بر توکن دسترسی OAuth، توکن شناسه OAuth کاربر نیز میتواند از شیء
OAuthCredentialبازیابی شود. ادعایsubدر توکن شناسه مختص برنامه است و با شناسه کاربر فدرال مورد استفاده توسط Firebase Auth که از طریقuser.providerData[0].uidقابل دسترسی است، مطابقت نخواهد داشت. به جای آن باید از فیلدoidclaim استفاده شود. هنگام استفاده از یک مستاجر Azure AD برای ورود به سیستم، ادعایoidدقیقاً مطابقت خواهد داشت. با این حال، برای مورد غیر مستاجر، فیلدoidپر شده است. برای یک شناسه فدرال4b2eabcdefghijkl،oidفرمی به شکل00000000-0000-0000-4b2e-abcdefghijklخواهد داشت.در حالی که مثالهای بالا بر جریانهای ورود به سیستم تمرکز دارند، شما همچنین میتوانید با استفاده از
linkWithCredentialیک ارائهدهنده مایکروسافت را به یک کاربر موجود پیوند دهید. به عنوان مثال، میتوانید چندین ارائهدهنده را به یک کاربر پیوند دهید و به آنها اجازه دهید با هر یک از آنها وارد سیستم شوند.سویفت
Auth().currentUser.link(withCredential: credential) { authResult, error in if error != nil { // Handle error. } // Microsoft credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // OAuth access token can also be retrieved: // (authResult.credential as? OAuthCredential)?.accessToken // OAuth ID token can also be retrieved: // (authResult.credential as? OAuthCredential)?.idToken }
هدف-سی
[[FIRAuth auth].currentUser linkWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { // Handle error. } // Microsoft credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // OAuth access token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).accessToken // OAuth ID token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).idToken }];
همین الگو را میتوان با
reauthenticateWithCredentialنیز استفاده کرد که میتواند برای بازیابی اعتبارنامههای جدید برای عملیات حساسی که نیاز به ورود اخیر دارند، استفاده شود.سویفت
Auth().currentUser.reauthenticateWithCredential(withCredential: credential) { authResult, error in if error != nil { // Handle error. } // User is re-authenticated with fresh tokens minted and // should be able to perform sensitive operations like account // deletion and email or password update. // IdP data available in result.additionalUserInfo.profile. // Additional OAuth access token can also be retrieved: // (authResult.credential as? OAuthCredential)?.accessToken // OAuth ID token can also be retrieved: // (authResult.credential as? OAuthCredential)?.idToken }
هدف-سی
[[FIRAuth auth].currentUser reauthenticateWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { // Handle error. } // User is re-authenticated with fresh tokens minted and // should be able to perform sensitive operations like account // deletion and email or password update. // IdP data available in result.additionalUserInfo.profile. // Additional OAuth access token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).accessToken // OAuth ID token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).idToken }];
پس از اینکه کاربر برای اولین بار وارد سیستم میشود، یک حساب کاربری جدید ایجاد میشود و به اطلاعات احراز هویت - یعنی نام کاربری و رمز عبور، شماره تلفن یا اطلاعات ارائه دهنده مجوز - که کاربر با آن وارد سیستم شده است، پیوند داده میشود. این حساب جدید به عنوان بخشی از پروژه Firebase شما ذخیره میشود و میتواند برای شناسایی کاربر در هر برنامه در پروژه شما، صرف نظر از نحوه ورود کاربر، مورد استفاده قرار گیرد.
در برنامههای خود، میتوانید اطلاعات اولیه پروفایل کاربر را از شیء
Userدریافت کنید. به بخش مدیریت کاربران مراجعه کنید.در قوانین امنیتی پایگاه داده و Cloud Storage Firebase Realtime Database ، میتوانید شناسه کاربری منحصر به فرد کاربر وارد شده را از متغیر
authدریافت کنید و از آن برای کنترل دادههایی که کاربر میتواند به آنها دسترسی داشته باشد، استفاده کنید.
برای خروج از سیستم کاربر، تابع signOut: را فراخوانی کنید.
سویفت
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
هدف-سی
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
همچنین میتوانید کد مدیریت خطا را برای طیف کامل خطاهای احراز هویت اضافه کنید. به بخش مدیریت خطاها مراجعه کنید.