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

می‌توانید با ادغام «ورود به سیستم OAuth عمومی» مبتنی بر وب در برنامه‌تان بااستفاده از «کیت توسعه نرم‌افزار Firebase»، به کاربران اجازه دهید بااستفاده از ارائه‌دهندگان OAuth مثل Microsoft Azure Active Directory با Firebase اصالت‌سنجی کنند تا جریان ورود به سیستم سرتاسری را انجام دهند. ازآنجایی‌که این جریان نیازمند استفاده از کیت‌های توسعه نرم‌افزار Firebase مبتنی بر تلفن است، فقط در پلاتفرم‌های Android و Apple پشتیبانی می‌شود.

قبل از شروع

پیش‌از اینکه بتوانید از Firebase Authentication استفاده کنید، باید:

  • پروژه Unity خود را ثبت کنید و آن را برای استفاده از Firebase پیکربندی کنید.

    • اگر پروژه Unity شما ازقبل از Firebase استفاده می‌کند، پس ازقبل برای Firebase ثبت و پیکربندی شده است.

    • اگر پروژه Unity ندارید، می‌توانید برنامه نمونه‌ای را بارگیری کنید.

  • Firebase Unity SDK (به‌طور دقیق، FirebaseAuth.unitypackage) را به پروژه Unity خود اضافه کنید.

توجه داشته باشید که افزودن Firebase به پروژه Unity شما شامل وظایفی در هر دو Firebase کنسول و پروژه Unity باز شما است (برای مثال، فایل‌های پیکربندی Firebase را از کنسول بارگیری می‌کنید، سپس آن‌ها را به پروژه Unity خود منتقل می‌کنید).

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

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

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

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

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

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    providerData.ProviderId = Firebase.Auth.MicrosoftAuthProvider.ProviderId;
    
  2. اختیاری: پارامترهای سفارشی OAuth اضافی را که می‌خواهید با درخواست OAuth ارسال کنید مشخص کنید.

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Prompt user to re-authenticate to Microsoft.
    providerData.CustomParameters.Add("prompt", "login");
    
    // Target specific email with login hint.
    providerData.CustomParameters.Add("login_hint",
        "user@firstadd.onmicrosoft.com");
    

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

    برای اینکه فقط کاربران یک مستأجر Azure AD خاص بتوانند به سیستم برنامه وارد شوند، می‌توان از نام دامنه آشنای مستأجر Azure AD یا شناسه GUID مستأجر استفاده کرد. این کار را می‌توانید با مشخص کردن فیلد «مستأجر» در شیء پارامترهای سفارشی انجام دهید.

    // Optional "tenant" parameter in case you are using an Azure AD tenant.
    // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com'
    // or "common" for tenant-independent tokens.
    // The default value is "common".
    providerData.CustomParameters.Add("tenant", "TENANT_ID");
    
  3. اختیاری: حوزه‌های OAuth 2.0 اضافی را فراتر از نمایه پایه که می‌خواهید از ارائه‌دهنده اصالت‌سنجی درخواست کنید مشخص کنید.

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("mail.read");
    providerData.Scopes.Add("calendars.read");
    

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

  4. پس‌از پیکربندی داده‌های ارائه‌دهنده، از آن برای ایجاد FederatedOAuthProvider استفاده کنید.

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

    برای شروع جریان ورود به سیستم، SignInAndRetrieveDataWithCredentialAsync را فراخوانی کنید:

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

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

    برخلاف ارائه‌دهندگان دیگری که «احراز هویت Firebase» پشتیبانی می‌کند، Microsoft نشانی وب عکس ارائه نمی‌دهد و درعوض، داده‌های باینری عکس نمایه باید ازطریق Microsoft Graph API درخواست شود.

  6. درحالی‌که مثال‌های بالا بر جریان‌های ورود به سیستم تمرکز دارند، شما همچنین این امکان را دارید که بااستفاده از LinkWithProviderAsync، ارائه‌دهنده Microsoft Azure Active Directory را به کاربر موجود پیوند دهید. برای مثال، می‌توانید چندین ارائه‌دهنده را به یک کاربر پیوند دهید و به او اجازه دهید با هرکدام از آن‌ها وارد سیستم شود.

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

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

مراحل بعدی

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

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

    Firebase.Auth.FirebaseUser user = auth.CurrentUser;
    if (user != null) {
      string name = user.DisplayName;
      string email = user.Email;
      System.Uri photo_url = user.PhotoUrl;
      // The user's Id, unique to the Firebase project.
      // Do NOT use this value to authenticate with your backend server, if you
      // have one; use User.TokenAsync() instead.
      string uid = user.UserId;
    }
  • در Firebase Realtime Database و Cloud Storage قوانین امنیتی، می‌توانید شناسه کاربر یکتای کاربر واردشده به سیستم را از متغیر auth دریافت کنید و از آن برای کنترل داده‌هایی که کاربر می‌تواند به آن‌ها دسترسی داشته باشد استفاده کنید.

می‌توانید به کاربران اجازه دهید با پیوند دادن اطلاعات اعتباری ارائه‌دهنده اصالت‌سنجی به حساب کاربری موجود بااستفاده از چندین ارائه‌دهنده اصالت‌سنجی به سیستم برنامه‌تان وارد شوند.

برای خروج از سیستم کاربر، SignOut() را فراخوانی کنید:

auth.SignOut();