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

می‌توانید به کاربران خود اجازه دهید با Firebase با استفاده از ارائه‌دهندگان OAuth مانند Yahoo با ادغام ورود به سیستم OAuth عمومی در برنامه خود با استفاده از Firebase SDK برای انجام جریان ورود به سیستم از پایان به انتها، احراز هویت کنند.

قبل از شروع

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

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

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

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

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

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

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

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

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

      تصویر صفحه رابط راه اندازی طرح URL سفارشی Xcode

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

    سویفت

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

    هدف-C

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

    سویفت

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

    هدف-C

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

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

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

    سویفت

    // 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"]
        

    هدف-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"]];
        

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

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

  6. با استفاده از شی ارائه دهنده OAuth با Firebase احراز هویت کنید.

    سویفت

    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
    }
    }
    }
        

    هدف-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 شناسه کاربر یاهو است که می تواند از قسمت Auth.auth.currentUser.providerData[0].uid یا از authResult.additionalUserInfo.profile بازیابی شود.

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

    سویفت

    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
    }
        

    هدف-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 استفاده کرد که می تواند برای بازیابی اعتبارنامه های جدید برای عملیات حساسی که نیاز به ورود اخیر دارند استفاده شود.

    سویفت

    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
    }
        

    هدف-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: .

سویفت

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

هدف-C

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

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