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

شما می‌توانید با استفاده از Firebase SDK برای انجام جریان ورود به سیستم OAuth 2.0 به صورت سرتاسری، به کاربران خود اجازه دهید تا با استفاده از Apple ID خود در Firebase احراز هویت کنند.

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

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

به برنامه توسعه‌دهندگان اپل بپیوندید

ورود به سیستم با اپل فقط توسط اعضای برنامه توسعه‌دهندگان اپل قابل پیکربندی است.

پیکربندی ورود به سیستم با اپل

ورود به سیستم اپل (Apple Sign In) باید در پروژه فایربیس شما فعال و به درستی پیکربندی شود. پیکربندی توسعه‌دهنده اپل (Apple Developer) در پلتفرم‌های اندروید و اپل متفاوت است. لطفاً قبل از ادامه، بخش «پیکربندی ورود به سیستم با اپل» را در راهنماهای iOS+ و/یا اندروید دنبال کنید.

فعال کردن اپل به عنوان ارائه دهنده ورود به سیستم

  1. در کنسول Firebase ، به بخش امنیت > احراز هویت بروید.
  2. در تب روش ورود ، ارائه‌دهنده‌ی ورود به سیستم اپل را فعال کنید.
  3. تنظیمات ارائه دهنده ورود به سیستم اپل را پیکربندی کنید:
    • اپل : اگر برنامه خود را فقط روی پلتفرم‌های اپل مستقر می‌کنید، می‌توانید فیلدهای شناسه سرویس، شناسه تیم اپل، کلید خصوصی و شناسه کلید را خالی بگذارید.
    • اندروید : برای پشتیبانی از دستگاه‌های اندروید، موارد زیر را تکمیل کنید:
      1. فایربیس را به پروژه اندروید خود اضافه کنید .
      2. اگر قبلاً اثر انگشت SHA-1 برنامه خود را مشخص نکرده‌اید، آن را مشخص کنید.
        1. در کنسول Firebase ، به مسیر زیر بروید: > برگه عمومی .
        2. به پایین صفحه و قسمت «برنامه‌های شما» بروید، برنامه اندروید خود را انتخاب کنید و اثر انگشت SHA-1 خود را در قسمت «اثر انگشت گواهی SHA» اضافه کنید.

        برای جزئیات بیشتر در مورد نحوه دریافت اثر انگشت SHA برنامه خود، به بخش احراز هویت کلاینت خود مراجعه کنید.

      3. تنظیمات ارائه دهنده ورود به سیستم اپل را پیکربندی کنید:
        1. در کنسول Firebase ، به بخش امنیت > احراز هویت بروید.
        2. در برگه «روش ورود» ، روی ارائه‌دهنده ورود به سیستم اپل کلیک کنید.
        3. شناسه سرویس (Service ID) که در قسمت قبل ایجاد کردید را مشخص کنید. همچنین در قسمت پیکربندی جریان کد OAuth، شناسه تیم اپل (Apple Team ID) و کلید خصوصی و شناسه کلید خود را که در قسمت قبل ایجاد کردید، مشخص کنید.

مطابق با الزامات داده‌های ناشناس اپل

ورود با اپل به کاربران این امکان را می‌دهد که هنگام ورود به سیستم، داده‌های خود، از جمله آدرس ایمیل خود را ناشناس کنند. کاربرانی که این گزینه را انتخاب می‌کنند، آدرس‌های ایمیلی با دامنه privaterelay.appleid.com دارند. هنگامی که از ورود با اپل در برنامه خود استفاده می‌کنید، باید از هرگونه سیاست یا شرایط توسعه‌دهنده مربوطه از سوی اپل در مورد این شناسه‌های اپل ناشناس پیروی کنید.

این شامل دریافت هرگونه رضایت کاربر قبل از مرتبط کردن هرگونه اطلاعات شخصی که مستقیماً هویت شما را مشخص می‌کند با یک Apple ID ناشناس می‌شود. هنگام استفاده از احراز هویت Firebase، این ممکن است شامل اقدامات زیر باشد:

  • یک آدرس ایمیل را به یک Apple ID ناشناس یا برعکس پیوند دهید.
  • یک شماره تلفن را به یک اپل آیدی ناشناس یا برعکس پیوند دهید
  • یک اعتبارنامه اجتماعی غیر ناشناس (فیس‌بوک، گوگل و غیره) را به یک اپل آیدی ناشناس یا برعکس پیوند دهید.

لیست بالا کامل نیست. برای اطمینان از اینکه برنامه شما الزامات اپل را برآورده می‌کند، به توافقنامه مجوز برنامه توسعه‌دهندگان اپل در بخش عضویت حساب توسعه‌دهندگان خود مراجعه کنید.

به کلاس Firebase.Auth.FirebaseAuth دسترسی پیدا کنید.

کلاس FirebaseAuth دروازه‌ای برای تمام فراخوانی‌های API است و از طریق FirebaseAuth.DefaultInstance قابل دسترسی است.
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

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

فرآیند ورود به سیستم با اپل در پلتفرم‌های اپل و اندروید متفاوت است.

در پلتفرم‌های اپل

  1. یک افزونه شخص ثالث برای مدیریت نانس ورود به سیستم اپل و تولید توکن، مانند بسته ذخیره‌سازی دارایی اپل یونیتی (Sign In With Apple Asset Storage Package ) نصب کنید. ممکن است لازم باشد کد را تغییر دهید تا رشته نانس تصادفی تولید شده را در حالت رشته خام خود برای استفاده در عملیات Firebase قرار دهید (یعنی قبل از ایجاد فرم خلاصه SHA256 نانس، یک کپی از آن را ذخیره کنید).

  2. از رشته توکن حاصل و نانس خام برای ساخت یک اعتبارنامه Firebase و ورود به Firebase استفاده کنید.

    Firebase.Auth.Credential credential =
        Firebase.Auth.OAuthProvider.GetCredential("apple.com", appleIdToken, rawNonce, null);
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.AuthResult result = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          result.User.DisplayName, result.User.UserId);
    });

  3. همین الگو را می‌توان با ReauthenticateAsync نیز استفاده کرد که می‌تواند برای بازیابی اعتبارنامه‌های جدید برای عملیات حساسی که نیاز به ورود اخیر دارند، استفاده شود. برای اطلاعات بیشتر به مدیریت کاربران مراجعه کنید.

  4. هنگام اتصال به Apple Sign In در پلتفرم‌های اپل، ممکن است با خطایی مبنی بر اینکه یک حساب Firebase موجود قبلاً به حساب Apple متصل شده است، مواجه شوید. در این صورت، به جای Firebase.FirebaseException استاندارد، Firebase.Auth.FirebaseAccountLinkException صادر می‌شود. در این حالت، استثنا شامل یک ویژگی UserInfo.UpdatedCredential است که در صورت معتبر بودن، می‌تواند برای ورود کاربر متصل به Apple از طریق FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync استفاده شود. اعتبارنامه به‌روزرسانی‌شده، نیاز به تولید توکن جدید Apple Sign-In با nonce برای عملیات ورود به سیستم را از بین می‌برد.

    auth.CurrentUser.LinkWithCredentialAsync(
      Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null))
        .ContinueWithOnMainThread( task => {
          if (task.IsCompletedSuccessfully) {
            // Link Success
          } else {
            if (task.Exception != null) {
              foreach (Exception exception in task.Exception.Flatten().InnerExceptions) {
                Firebase.Auth.FirebaseAccountLinkException firebaseEx =
                  exception as Firebase.Auth.FirebaseAccountLinkException;
                if (firebaseEx != null && firebaseEx.UserInfo.UpdatedCredential.IsValid()) {
                  // Attempt to sign in with the updated credential.
                  auth.SignInAndRetrieveDataWithCredentialAsync(firebaseEx.UserInfo.UpdatedCredential).
                    ContinueWithOnMainThread( authResultTask => {
                      // Handle Auth result.
                    });
                } else {
                  Debug.Log("Link with Apple failed:" + firebaseEx );
                }
              } // end for loop
            }
          }
        });

در اندروید

در اندروید، کاربران خود را با Firebase احراز هویت کنید، به این صورت که با استفاده از Firebase SDK و با ادغام OAuth Login عمومی مبتنی بر وب در برنامه خود، جریان ورود به سیستم را از ابتدا تا انتها انجام دهید.

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

  1. یک نمونه از FederatedOAuthProviderData پیکربندی شده با شناسه ارائه دهنده مناسب برای اپل بسازید.

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. اختیاری: محدوده‌های اضافی OAuth 2.0 را فراتر از پیش‌فرضی که می‌خواهید از ارائه‌دهنده احراز هویت درخواست کنید، مشخص کنید.

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("email");
    providerData.Scopes.Add("name");
    
  3. اختیاری: اگر می‌خواهید صفحه ورود به سیستم اپل را به زبانی غیر از انگلیسی نمایش دهید، پارامتر locale را تنظیم کنید. برای اطلاع از زبان‌های پشتیبانی‌شده، به اسناد Sign In with Apple مراجعه کنید.

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Localize to French.
    providerData.CustomParameters.Add("language", "fr");
    
  4. پس از پیکربندی داده‌های ارائه‌دهنده، از آن برای ایجاد یک FederatedOAuthProvider استفاده کنید.

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
      new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. با استفاده از شیء ارائه دهنده Auth، با Firebase احراز هویت کنید. توجه داشته باشید که برخلاف سایر عملیات FirebaseAuth، این کار با نمایش یک نمای وب که کاربر می‌تواند اعتبارنامه‌های خود را در آن وارد کند، کنترل رابط کاربری شما را به دست می‌گیرد.

    برای شروع جریان ورود، تابع signInWithProvider را فراخوانی کنید:

    auth.SignInWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("SignInWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError("SignInWithProviderAsync encountered an error: " +
              task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User signed in successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  6. همین الگو را می‌توان با ReauthenticateWithProvider استفاده کرد که می‌تواند برای بازیابی اعتبارنامه‌های جدید برای عملیات حساسی که نیاز به ورود اخیر دارند، استفاده شود.

    user.ReauthenticateWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("ReauthenticateWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError(
            "ReauthenticateWithProviderAsync encountered an error: " +
                task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User reauthenticated successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  7. و می‌توانید از LinkWithCredentialAsync() برای پیوند دادن ارائه‌دهندگان هویت مختلف به حساب‌های موجود استفاده کنید.

    توجه داشته باشید که اپل از شما می‌خواهد قبل از پیوند دادن حساب‌های اپل کاربران به سایر داده‌ها، رضایت صریح آنها را دریافت کنید.

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

    // Initialize a Facebook credential with a Facebook access token.
    
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(facebook_token);
    
    // Assuming the current user is an Apple user linking a Facebook provider.
    user.LinkWithCredentialAsync(credential)
        .ContinueWithOnMainThread( task => {
          if (task.IsCanceled) {
              Debug.LogError("LinkWithCredentialAsync was canceled.");
              return;
          }
          if (task.IsFaulted) {
            Debug.LogError("LinkWithCredentialAsync encountered an error: "
                           + task.Exception);
              return;
          }
    
          Firebase.Auth.AuthResult result = task.Result;
          Firebase.Auth.FirebaseUser user = result.User;
          Debug.LogFormat("User linked successfully: {0} ({1})",
              user.DisplayName, user.UserId);
        });
    

ورود با یادداشت‌های اپل

برخلاف سایر ارائه‌دهندگان پشتیبانی‌شده توسط Firebase Auth، اپل آدرس اینترنتی عکس ارائه نمی‌دهد.

همچنین، وقتی کاربر تصمیم می‌گیرد ایمیل خود را با برنامه به اشتراک نگذارد، اپل یک آدرس ایمیل منحصر به فرد برای آن کاربر (به شکل xyz@privaterelay.appleid.com ) فراهم می‌کند که آن را با برنامه شما به اشتراک می‌گذارد. اگر سرویس رله ایمیل خصوصی را پیکربندی کرده باشید، اپل ایمیل‌های ارسالی به آدرس ناشناس را به آدرس ایمیل واقعی کاربر ارسال می‌کند.

اپل فقط اطلاعات کاربر مانند نام نمایشی را در اولین ورود کاربر با برنامه‌ها به اشتراک می‌گذارد. معمولاً Firebase نام نمایشی را در اولین ورود کاربر به اپل ذخیره می‌کند که می‌توانید آن را با auth.CurrentUser.DisplayName دریافت کنید. با این حال، اگر قبلاً از اپل برای ورود کاربر به برنامه بدون استفاده از Firebase استفاده کرده‌اید، اپل نام نمایشی کاربر را در اختیار Firebase قرار نخواهد داد.

مراحل بعدی

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

در برنامه‌های خود، می‌توانید اطلاعات اولیه پروفایل کاربر را از شیء Firebase.Auth.FirebaseUser دریافت کنید. به مدیریت کاربران مراجعه کنید.

در قوانین امنیتی پایگاه داده و فضای ابری Firebase Realtime، می‌توانید شناسه کاربری منحصر به فرد کاربر وارد شده را از متغیر auth دریافت کنید و از آن برای کنترل داده‌هایی که کاربر می‌تواند به آنها دسترسی داشته باشد، استفاده کنید.