اصالت‌سنجی بااستفاده از Yahoo در پلاتفرم‌های Apple

می‌توانید به کاربران خود اجازه دهید بااستفاده از ارائه‌دهندگان OAuth مانند Yahoo، با Firebase اصالت‌سنجی کنند. این کار ازطریق ادغام «ورود به سیستم OAuth» عمومی در برنامه شما بااستفاده از «کیت توسعه نرم‌افزار Firebase» برای اجرای جریان ورود به سیستم سرتاسر انجام می‌شود.

قبل از شروع

برای ورود به سیستم کاربران بااستفاده از حساب‌های Yahoo، ابتدا باید Yahoo را به‌عنوان ارائه‌دهنده ورود به سیستم برای پروژه Firebase خود فعال کنید:

  1. افزودن Firebase به پروژه Apple.
  2. در کنسول Firebase، به امنیت > اصالت‌سنجی بروید.
  3. در برگه روش ورود به سیستم، ارائه‌دهنده ورود به سیستم Yahoo را فعال کنید.
  4. شناسه کارخواه و رمز کارخواه را از کنسول توسعه‌دهنده آن ارائه‌دهنده به پیکربندی ارائه‌دهنده اضافه کنید:
    1. برای ثبت کارخواه Yahoo OAuth، مستندات توسعه‌دهنده Yahoo را درباره ثبت برنامه وب با Yahoo دنبال کنید.

      حتماً دو اجازه OpenID Connect API را انتخاب کنید: profile و email.

    2. هنگام ثبت برنامه‌ها با این ارائه‌دهندگان، حتماً دامنه *.firebaseapp.com را برای پروژه‌تان به‌عنوان دامنه تغییرمسیر برای برنامه‌تان ثبت کنید.
  5. روی ذخیره کردن کلیک کنید.

جریان ورود به سیستم را با کیت توسعه نرم‌افزار Firebase مدیریت کنید

برای مدیریت جریان ورود به سیستم با Firebase Apple platforms SDK، این مراحل را دنبال کنید:

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

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

      می‌توانید «شناسه برنامه کدبندی‌شده» را در کنسول Firebase پیدا کنید: به تنظیمات > برگه کلی بروید، سپس به بخش برنامه‌های شما پیمایش کنید تا جزئیات مربوط به برنامه iOS خود را مشاهده کنید.

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

      نماگرفت میانای راه‌اندازی طرح‌واره نشانی وب سفارشی Xcode

  2. بااستفاده از شناسه ارائه‌دهنده yahoo.com، نمونه‌ای از OAuthProvider ایجاد کنید.

    Swift

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

    Objective-C

    FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"yahoo.com"];
        
  3. اختیاری: پارامترهای OAuth سفارشی دیگری را که می‌خواهید با درخواست OAuth ارسال شود مشخص کنید.

    Swift

    provider.customParameters = [
    "prompt": "login",
    "language": "fr"
    ]
        

    Objective-C

    [provider setCustomParameters:@{@"prompt": @"login", @"language": @"fr"}];
        

    برای پارامترهایی که Yahoo پشتیبانی می‌کند، به اسناد Yahoo OAuth مراجعه کنید. توجه داشته باشید که نمی‌توانید پارامترهای الزامی Firebase را با setCustomParameters ارسال کنید. این پارامترها عبارت‌اند از client_id، redirect_uri، response_type، scope، و state.

  4. اختیاری: دامنه‌های OAuth 2.0 اضافی را فراتر از profile و email که می‌خواهید از ارائه‌دهنده اصالت‌سنجی درخواست کنید مشخص کنید. اگر برنامه شما به دسترسی به داده‌های خصوصی کاربر از Yahoo API نیاز دارد، باید در کنسول توسعه‌دهنده Yahoo در بخش اجازه‌های API، اجازه‌های Yahoo API را درخواست کنید. گستره‌های OAuth درخواست‌شده باید دقیقاً با گستره‌های ازپیش‌پیکربندی‌شده در اجازه‌های میانای برنامه‌سازی کاربردی برنامه مطابقت داشته باشد. برای مثال، اگر دسترسی خواندن/نوشتن به مخاطبین کاربر درخواست شده باشد و در اجازه‌های میانای برنامه‌سازی کاربردی برنامه ازپیش پیکربندی شده باشد، به‌جای گستره OAuth فقط خواندنی sdct-r باید sdct-w ارسال شود. درغیراین‌صورت، جریان ناموفق خواهد بود و خطایی به کاربر نهایی نشان داده خواهد شد.

    Swift

    // Request access to Yahoo Mail API.
    // Request read/write access to user contacts.
    // This must be preconfigured in the app's API permissions.
    provider.scopes = ["mail-r", "sdct-w"]
        

    Objective-C

    // Request access to Yahoo Mail API.
    // Request read/write access to user contacts.
    // This must be preconfigured in the app's API permissions.
    [provider setScopes:@[@"mail-r", @"sdct-w"]];
        

    برای کسب اطلاعات بیشتر، به اسناد گستره‌های Yahoo مراجعه کنید.

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

  6. بااستفاده از شیء ارائه‌دهنده OAuth، با Firebase اصالت‌سنجی کنید.

    Swift

    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.
      // Yahoo OAuth access token can also be retrieved by:
      // (authResult.credential as? OAuthCredential)?.accessToken
      // Yahoo OAuth ID token can be retrieved by calling:
      // (authResult.credential as? OAuthCredential)?.idToken
    }
    }
    }
        

    Objective-C

    [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.
      // Yahoo OAuth access token can also be retrieved by:
      // ((FIROAuthCredential *)authResult.credential).accessToken
      // Yahoo OAuth ID token can be retrieved by calling:
      // ((FIROAuthCredential *)authResult.credential).idToken
    }];
    }
    }];
        

    بااستفاده از کد دسترسی OAuth، می‌توانید Yahoo API را فراخوانی کنید.

    برای مثال، برای دریافت اطلاعات نمایه پایه، می‌توانید REST API را فراخوانی کنید، و کد دسترسی را در سرصفحه Authorization ارسال کنید:

    https://social.yahooapis.com/v1/user/YAHOO_USER_UID/profile?format=json

    که YAHOO_USER_UID شناسه کاربر Yahoo است که می‌توان آن را از فیلد Auth.auth.currentUser.providerData[0].uid یا از authResult.additionalUserInfo.profile بازیابی کرد.

  7. درحالی‌که مثال‌های قبلی بر جریان‌های ورود به سیستم تمرکز دارند، می‌توانید بااستفاده از linkWithPopup، ارائه‌دهنده Yahoo را به کاربر موجود پیوند دهید. برای مثال، می‌توانید چندین ارائه‌دهنده را به یک کاربر پیوند دهید و به او اجازه دهید با هرکدام از آن‌ها به سیستم وارد شود.

    Swift

    Auth().currentUser.link(withCredential: credential) { authResult, error in
    if error != nil {
    // Handle error.
    }
    // Yahoo credential is linked to the current user.
    // IdP data available in authResult.additionalUserInfo.profile.
    // Yahoo OAuth access token can also be retrieved by:
    // (authResult.credential as? OAuthCredential)?.accessToken
    // Yahoo OAuth ID token can be retrieved by calling:
    // (authResult.credential as? OAuthCredential)?.idToken
    }
        

    Objective-C

    [[FIRAuth auth].currentUser
    linkWithCredential:credential
            completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
    if (error) {
    // Handle error.
    }
    // Yahoo credential is linked to the current user.
    // IdP data available in authResult.additionalUserInfo.profile.
    // Yahoo OAuth access token is can also be retrieved by:
    // ((FIROAuthCredential *)authResult.credential).accessToken
    // Yahoo OAuth ID token can be retrieved by calling:
    // ((FIROAuthCredential *)authResult.credential).idToken
    }];
        
  8. می‌توانید از همان الگو با reauthenticateWithPopup یا reauthenticateWithRedirect برای بازیابی اعتبارنامه‌های جدید برای عملیات حساسی که به ورود اخیر به سیستم نیاز دارند استفاده کنید.

    Swift

    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 is can also be retrieved by:
    // (authResult.credential as? OAuthCredential)?.accessToken
    // Yahoo OAuth ID token can be retrieved by calling:
    // (authResult.credential as? OAuthCredential)?.idToken
    }
        

    Objective-C

    [[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 is can also be retrieved by:
    // ((FIROAuthCredential *)authResult.credential).accessToken
    // Yahoo OAuth ID token can be retrieved by calling:
    // ((FIROAuthCredential *)authResult.credential).idToken
    }];
        

مراحل بعدی

پس‌از اینکه کاربر برای اولین‌بار به سیستم وارد شد، حساب کاربری جدیدی ایجاد می‌شود و به اطلاعات اعتباری (یعنی نام کاربری و گذرواژه، شماره تلفن، یا اطلاعات ارائه‌دهنده احراز هویت) که کاربر با آن به سیستم وارد شده است پیوند داده می‌شود. این حساب جدید به‌عنوان بخشی از پروژه Firebase شما ذخیره می‌شود و می‌توان از آن برای شناسایی کاربر در هر برنامه در پروژه شما، صرف‌نظر از نحوه ورود کاربر به سیستم، استفاده کرد.

  • در برنامه‌هایتان، می‌توانید اطلاعات نمایه پایه کاربر را از شیء User دریافت کنید. مدیریت کاربران را ببینید.

  • در Firebase Realtime Database و Cloud Storage قوانین امنیتی، می‌توانید شناسه کاربر منحصربه‌فرد کاربر واردشده به سیستم را از متغیر auth دریافت کنید، و از آن برای کنترل داده‌هایی که کاربر می‌تواند به آن‌ها دسترسی داشته باشد استفاده کنید.

می‌توانید به کاربران اجازه دهید بااستفاده از چند ارائه‌دهنده اصالت‌سنجی به سیستم برنامه‌تان وارد شوند. برای این کار، اعتبارنامه‌های ارائه‌دهنده اصالت‌سنجی را به حساب کاربری موجود پیوند دهید.

برای خارج کردن کاربر از سیستم، signOut: را فراخوانی کنید.

Swift

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

Objective-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

همچنین ممکن است بخواهید کد رسیدگی به خطا را برای طیف کامل خطاهای اصالت‌سنجی اضافه کنید. رسیدگی به خطاها را ببینید.