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

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

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

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

برای نصب و مدیریت وابستگی‌های Firebase از Swift Package Manager استفاده کنید.

  1. در Xcode، با باز کردن پروژه برنامه خود، به File > Add Packages بروید.
  2. وقتی از شما خواسته شد، مخزن SDK پلتفرم‌های اپل فایربیس را اضافه کنید:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. کتابخانه Firebase Authentication را انتخاب کنید.
  5. پرچم -ObjC را به بخش Other Linker Flags در تنظیمات ساخت هدف خود اضافه کنید.
  6. پس از اتمام، Xcode به طور خودکار شروع به حل و دانلود وابستگی‌های شما در پس‌زمینه می‌کند.

اکنون، برخی از مراحل پیکربندی را انجام دهید:

  1. در کنسول Firebase ، بخش Auth را باز کنید.
  2. در تب روش ورود ، ارائه‌دهنده‌ی گیت‌هاب را فعال کنید.
  3. شناسه کلاینت و راز کلاینت را از کنسول توسعه‌دهنده آن ارائه‌دهنده به پیکربندی ارائه‌دهنده اضافه کنید:
    1. برنامه خود را به عنوان یک برنامه توسعه‌دهنده در GitHub ثبت کنید و شناسه کلاینت OAuth 2.0 و رمز کلاینت برنامه خود را دریافت کنید.
    2. مطمئن شوید که آدرس اینترنتی تغییر مسیر OAuth مربوط به Firebase شما (مثلاً my-app-12345.firebaseapp.com/__/auth/handler ) به عنوان آدرس اینترنتی فراخوانی مجوز (Auth callback URL) در صفحه تنظیمات برنامه در فایل پیکربندی برنامه GitHub شما تنظیم شده باشد.
  4. روی ذخیره کلیک کنید.

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

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

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

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

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

      تصویری از رابط کاربری تنظیم طرح URL سفارشی Xcode

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

    سویفت

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

    هدف-سی

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

    سویفت

        provider.customParameters = [
          "allow_signup": "false"
        ]
        

    هدف-سی

        [provider setCustomParameters:@{@"allow_signup": @"false"}];
        

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

  4. اختیاری : محدوده‌های OAuth 2.0 اضافی فراتر از پروفایل پایه که می‌خواهید از ارائه‌دهنده احراز هویت درخواست کنید را مشخص کنید. اگر برنامه شما نیاز به دسترسی به داده‌های خصوصی کاربر از APIهای GitHub دارد، باید مجوزهای دسترسی به APIهای GitHub را در بخش مجوزهای API در کنسول توسعه‌دهنده GitHub درخواست کنید. محدوده‌های OAuth درخواستی باید دقیقاً با محدوده‌های از پیش تنظیم‌شده در مجوزهای API برنامه مطابقت داشته باشند.

    سویفت

        // Request read access to a user's email addresses.
        // This must be preconfigured in the app's API permissions.
        provider.scopes = ["user:email"]
        

    هدف-سی

        // Request read access to a user's email addresses.
        // This must be preconfigured in the app's API permissions.
        [provider setScopes:@[@"user:email"]];
        

    برای کسب اطلاعات بیشتر، به مستندات GitHub scopes مراجعه کنید.

  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.
    
              guard let oauthCredential = authResult.credential as? OAuthCredential else { return }
              // GitHub OAuth access token can also be retrieved by:
              // oauthCredential.accessToken
              // GitHub OAuth ID token can be retrieved by calling:
              // 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.
    
              FIROAuthCredential *oauthCredential = (FIROAuthCredential *)authResult.credential;
              // GitHub OAuth access token can also be retrieved by:
              // oauthCredential.accessToken
              // GitHub OAuth ID token can be retrieved by calling:
              // oauthCredential.idToken
            }];
          }
        }];
        

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

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

    https://api.github.com/user
  7. در حالی که مثال‌های بالا بر جریان‌های ورود به سیستم تمرکز دارند، شما همچنین می‌توانید یک ارائه‌دهنده‌ی گیت‌هاب را به یک کاربر موجود پیوند دهید. به عنوان مثال، می‌توانید چندین ارائه‌دهنده را به یک کاربر پیوند دهید و به آنها اجازه دهید با هر یک از آنها وارد سیستم شوند.

    سویفت

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

    هدف-سی

        [[FIRAuth auth].currentUser
            linkWithCredential:credential
                    completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
          if (error) {
            // Handle error.
          }
          // GitHub credential is linked to the current user.
          // IdP data available in authResult.additionalUserInfo.profile.
          // GitHub OAuth access token is can also be retrieved by:
          // ((FIROAuthCredential *)authResult.credential).accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // ((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 is can also be retrieved by:
          // (authResult.credential as? OAuthCredential)?.accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // (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 is can also be retrieved by:
          // ((FIROAuthCredential *)authResult.credential).accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // ((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;
}

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