اصالت‌سنجی بااستفاده از Apple و Unity

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

قبل از شروع

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

به «برنامه توسعه‌دهندگان Apple» بپیوندید

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

پیکربندی «ورود به سیستم با Apple»

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

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

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

        برای جزئیات مربوط به نحوه دریافت اثر انگشت SHA برنامه، اصالت‌سنجی مشتری را ببینید.

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

از الزامات داده‌های ناشناس‌سازی‌شده Apple پیروی کنید

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

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

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

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

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

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

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

فرایند «ورود به سیستم با Apple» در پلاتفرم‌های Apple و Android متفاوت است.

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

  1. افزایه طرف سومی را برای مدیریت کردن مقدار یک‌باره و تولید کد Apple نصب کنید، مثل بسته ذخیره‌سازی دارایی «ورود به سیستم با Apple» در Unity. ممکن است لازم باشد کد را تغییر دهید تا رشته تصادفی یک‌بارمصرف تولیدشده را در وضعیت رشته خام آن برای استفاده در عملیات Firebase (یعنی ذخیره کردن نسخه‌ای از آن قبل‌از ایجاد شکل خلاصه SHA256 یک‌بارمصرف) به کار ببرید.

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

    Firebase.Auth.Credential credential =
        Firebase.Auth.OAuthProvider.GetCredential("apple.com", appleIdToken, rawNonce, appleAuthorizationCode);
    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» در پلاتفرم‌های Apple ممکن است با خطایی مواجه شوید که می‌گوید حساب Firebase موجود ازقبل به حساب Apple پیوند داده شده است. وقتی این اتفاق می‌افتد، به‌جای Firebase.FirebaseException استاندارد، Firebase.Auth.FirebaseAccountLinkException پرتاب می‌شود. در این مورد، استثنا شامل UserInfo.UpdatedCredential دارایی می‌شود که درصورت معتبر بودن، ممکن است برای ورود به سیستم کاربر پیوندشده به Apple ازطریق FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync استفاده شود. اعتبارنامه به‌روزشده نیاز به تولید کد «ورود به سیستم با Apple» جدید با مقدار یک‌بارمصرف برای عملیات ورود به سیستم را دور می‌زند.

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

‫در Android

در Android، با ادغام کردن «ورود به سیستم OAuth» عمومی مبتنی بر وب در برنامه‌تان بااستفاده از «کیت توسعه نرم‌افزار Firebase»، کاربران را با Firebase اصالت‌سنجی کنید تا جریان ورود به سیستم سرتاسری را انجام دهید.

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

  1. نمونه‌ای از FederatedOAuthProviderData را با شناسه ارائه‌دهنده مناسب برای Apple بسازید.

    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. اختیاری: اگر می‌خواهید صفحه ورود به سیستم Apple به زبانی غیراز انگلیسی نمایش داده شود، پارامتر locale را تنظیم کنید. برای مشاهده زبان‌های پشتیبانی‌شده، به اسناد «ورود به سیستم با 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. بااستفاده از شیء ارائه‌دهنده «اصالت‌سنجی»، با 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() برای پیوند دادن ارائه‌دهندگان هویت مختلف به حساب‌های موجود استفاده کنید.

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

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

    // 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);
        });
    

ورود به سیستم با «یادداشت‌های Apple»

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

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

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

مراحل بعدی

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

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

در «قوانین امنیتی» «پایگاه داده بی‌درنگ Firebase» و «فضای ذخیره‌سازی ابری»، می‌توانید شناسه کاربر یکتای کاربر واردشده به سیستم را از متغیر auth دریافت کنید و از آن برای کنترل داده‌هایی که کاربر می‌تواند به آن‌ها دسترسی داشته باشد استفاده کنید.