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

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

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

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

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

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

پیکربندی ورود با اپل

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

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

  1. در کنسول Firebase ، بخش Auth را باز کنید. در برگه روش ورود ، ارائه دهنده اپل را فعال کنید.
  2. تنظیمات ارائه دهنده Apple Sign In را پیکربندی کنید:
    1. اگر برنامه خود را فقط در پلتفرم‌های اپل اجرا می‌کنید، می‌توانید قسمت‌های شناسه سرویس، شناسه تیم اپل، کلید خصوصی و شناسه کلید را خالی بگذارید.
    2. برای پشتیبانی در دستگاه های اندروید:
      1. Firebase را به پروژه اندروید خود اضافه کنید . هنگام تنظیم برنامه خود در کنسول Firebase، حتماً امضای SHA-1 برنامه خود را ثبت کنید.
      2. در کنسول Firebase ، بخش Auth را باز کنید. در برگه روش ورود ، ارائه دهنده اپل را فعال کنید. شناسه سرویسی که در قسمت قبل ایجاد کردید را مشخص کنید. همچنین در قسمت OAuth code flow configuration ID Apple Team و شناسه کلید خصوصی و کلیدی که در قسمت قبل ایجاد کرده اید را مشخص کنید.

الزامات داده های ناشناس اپل را رعایت کنید

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

این شامل اخذ هرگونه رضایت کاربر مورد نیاز قبل از مرتبط کردن هر گونه اطلاعات شخصی شناسایی مستقیم با یک شناسه ناشناس اپل است. هنگام استفاده از Firebase Authentication، این ممکن است شامل اقدامات زیر باشد:

  • یک آدرس ایمیل را به یک Apple ID ناشناس پیوند دهید یا برعکس.
  • یک شماره تلفن را به یک 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 Unity . ممکن است لازم باشد کد را تغییر دهید تا رشته nonce تصادفی تولید شده را در حالت رشته خام خود قرار دهید تا در عملیات Firebase استفاده شود (یعنی یک کپی از آن را قبل از ایجاد شکل خلاصه SHA256 از nonce ذخیره کنید).

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

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

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

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

    توجه داشته باشید که LinkWithCredentialAsync به پرتاب استاندارد Firebase.FirebaseException در مورد خرابی پیوندها ادامه می دهد و بنابراین قادر به بازگرداندن اعتبار به روز شده نیست.

    auth.CurrentUser.LinkAndRetrieveDataWithCredentialAsync(
      Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null))
        .ContinueWithOnMainThread( task => {
          if (task.IsCompleted) {
            // 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.SignInWithCredentialAsync(firebaseEx.UserInfo.UpdatedCredential).
                    ContinueWithOnMainThread( signInTask => {
                      // Handle Sign in result.
                    });
                } else {
                  DebugLog("Link with Apple failed:" + firebaseEx );
                }
              } // end for loop
            }
          }
        });
    

در اندروید

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

برای مدیریت جریان ورود به سیستم با 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 را تنظیم کنید. برای مناطق پشتیبانی شده، به اسناد ورود با اپل مراجعه کنید.

    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.SignInResult signInResult = task.Result;
        Firebase.Auth.FirebaseUser user = signInResult.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.SignInResult signInResult = task.Result;
        Firebase.Auth.FirebaseUser user = signInResult.User;
        Debug.LogFormat("User reauthenticated successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  7. و، می توانید از linkWithCredential() برای پیوند دادن ارائه دهندگان هویت مختلف به حساب های موجود استفاده کنید.

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

    به عنوان مثال، برای پیوند دادن یک حساب فیس بوک به حساب فعلی 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.LinkAndRetrieveDataWithCredentialAsync(credential)
        .ContinueWithOnMainThread( task => {
          if (task.IsCanceled) {
              Debug.LogError("LinkAndRetrieveDataWithCredentialAsync was canceled.");
              return;
          }
          if (task.IsFaulted) {
            Debug.LogError("LinkAndRetrieveDataWithCredentialAsync encountered an error: "
                           + task.Exception);
              return;
          }
    
          Firebase.Auth.SignInResult signInResult = task.Result;
          Firebase.Auth.FirebaseUser user = signInResult.User;
          Debug.LogFormat("User linked successfully: {0} ({1})",
              user.DisplayName, user.UserId);
        });
    

با Apple Notes وارد شوید

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

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

اپل تنها اولین باری که کاربر وارد سیستم می شود، اطلاعات کاربر مانند نام نمایشی را با برنامه ها به اشتراک می گذارد. معمولاً، Firebase نام نمایشی را در اولین باری که کاربر با اپل وارد می شود، ذخیره می کند، که می توانید با getCurrentUser().getDisplayName() دریافت کنید. با این حال، اگر قبلاً از اپل برای ورود کاربر به برنامه بدون استفاده از Firebase استفاده کرده‌اید، اپل نام نمایشی کاربر را به Firebase ارائه نمی‌کند.

مراحل بعدی

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

در برنامه های خود، می توانید اطلاعات اولیه پروفایل کاربر را از firebase::auth::user object دریافت کنید. به مدیریت کاربران مراجعه کنید.

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