احراز هویت با استفاده از مایکروسافت در پلتفرم های اپل

شما می‌توانید با ادغام ورود عمومی مبتنی بر وب OAuth در برنامه خود با استفاده از Firebase SDK، به کاربران خود اجازه دهید تا با استفاده از ارائه‌دهندگان OAuth مانند Microsoft Azure Active Directory، احراز هویت خود را با Firebase انجام دهند تا جریان ورود به سیستم سرتاسری را انجام دهند.

قبل از اینکه شروع کنی

برای ورود کاربران با استفاده از حساب‌های مایکروسافت (Azure Active Directory و حساب‌های شخصی مایکروسافت)، ابتدا باید مایکروسافت را به عنوان ارائه‌دهنده ورود به سیستم برای پروژه Firebase خود فعال کنید:

  1. فایربیس را به پروژه اپل خود اضافه کنید .
  2. در کنسول Firebase ، به بخش امنیت > احراز هویت بروید.
  3. در تب روش ورود ، ارائه دهنده ورود به سیستم مایکروسافت را فعال کنید.
  4. شناسه کلاینت و راز کلاینت را از کنسول توسعه‌دهنده آن ارائه‌دهنده به پیکربندی ارائه‌دهنده اضافه کنید:
    1. برای ثبت یک کلاینت Microsoft OAuth، دستورالعمل‌های موجود در Quickstart را دنبال کنید: یک برنامه را با نقطه پایانی Azure Active Directory v2.0 ثبت کنید . توجه داشته باشید که این نقطه پایانی از ورود به سیستم با استفاده از حساب‌های شخصی مایکروسافت و همچنین حساب‌های Azure Active Directory پشتیبانی می‌کند. درباره Azure Active Directory v2.0 بیشتر بدانید.
    2. هنگام ثبت برنامه‌ها در این ارائه‌دهندگان، حتماً دامنه *.firebaseapp.com را برای پروژه خود به عنوان دامنه تغییر مسیر برای برنامه خود ثبت کنید.
  5. روی ذخیره کلیک کنید.

مدیریت جریان ورود به سیستم با Firebase SDK

برای مدیریت جریان ورود به سیستم با SDK پلتفرم‌های اپل فایربیس، این مراحل را دنبال کنید:

  1. طرح‌های URL سفارشی را به پروژه Xcode خود اضافه کنید:

    1. پیکربندی پروژه خود را باز کنید: روی نام پروژه در نمای درختی سمت چپ دوبار کلیک کنید. برنامه خود را از بخش TARGETS انتخاب کنید، سپس تب Info را انتخاب کنید و بخش URL Types را باز کنید.
    2. روی دکمه + کلیک کنید و شناسه برنامه رمزگذاری شده خود را به عنوان یک طرح URL اضافه کنید. سایر فیلدها را خالی بگذارید.

      می‌توانید شناسه برنامه رمزگذاری شده خود را در کنسول Firebase پیدا کنید: به > برگه عمومی ، سپس به پایین صفحه بروید تا به بخش برنامه‌های شما برسید تا جزئیات مربوط به برنامه iOS خود را مشاهده کنید.

      پس از تکمیل، پیکربندی شما باید چیزی شبیه به موارد زیر باشد (اما با مقادیر خاص برنامه شما):

      تصویری از رابط کاربری تنظیم طرح URL سفارشی Xcode
  2. با استفاده از شناسه ارائه دهنده microsoft.com، یک نمونه از OAuthProvider ایجاد کنید.

    سویفت

        var provider = OAuthProvider(providerID: "microsoft.com")
        

    هدف-سی

        FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"microsoft.com"];
        
  3. اختیاری : پارامترهای سفارشی اضافی 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"};
        
  4. اختیاری : محدوده‌های اضافی OAuth 2.0 فراتر از پروفایل پایه که می‌خواهید از ارائه‌دهنده احراز هویت درخواست کنید را مشخص کنید.

    سویفت

        provider.scopes = ["mail.read", "calendars.read"]
        

    هدف-سی

        [provider setScopes:@[@"mail.read", @"calendars.read"]];
        

    برای کسب اطلاعات بیشتر، به مستندات مجوزها و رضایت‌نامه‌های مایکروسافت مراجعه کنید.

  5. اختیاری : اگر می‌خواهید نحوه نمایش SFSafariViewController یا UIWebView توسط برنامه خود را هنگام نمایش reCAPTCHA به کاربر سفارشی کنید، یک کلاس سفارشی ایجاد کنید که با پروتکل AuthUIDelegate مطابقت داشته باشد و آن را به credentialWithUIDelegate منتقل کنید.

  6. با استفاده از شیء ارائه دهنده 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 قابل دسترسی است، مطابقت نخواهد داشت. به جای آن باید از فیلد oid claim استفاده شود. هنگام استفاده از یک مستاجر Azure AD برای ورود به سیستم، ادعای oid دقیقاً مطابقت خواهد داشت. با این حال، برای مورد غیر مستاجر، فیلد oid پر شده است. برای یک شناسه فدرال 4b2eabcdefghijkl ، oid فرمی به شکل 00000000-0000-0000-4b2e-abcdefghijkl خواهد داشت.

  7. در حالی که مثال‌های بالا بر جریان‌های ورود به سیستم تمرکز دارند، شما همچنین می‌توانید با استفاده از 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
        }];
        
  8. همین الگو را می‌توان با 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;
}

همچنین می‌توانید کد مدیریت خطا را برای طیف کامل خطاهای احراز هویت اضافه کنید. به بخش مدیریت خطاها مراجعه کنید.