0

我正在尝试为 Xamarin Forms App 实现 Facebook Auth。我正在做本教程https://docs.microsoft.com/en-us/xamarin/essentials/web-authenticator?tabs=android中的所有操作,所以我使用的是服务器端身份验证。这是我的移动应用程序代码:

   public class WebAuthViewModel:ObservableObject
    {
        private const string AuthenticationUrl = "https://myapp.com/mobileauth/";

        private string _accessToken = "";
        private bool _isAuthenticated = false;

        public string AuthToken
        {
            get => _accessToken;
            set => SetProperty(ref _accessToken, value);
        }
    
        public ICommand FacebookCommand { get; }

        public WebAuthViewModel()
        {
            FacebookCommand = new Command(async()=>await OnAuthenticate("Facebook"));
        }

        async Task OnAuthenticate(string scheme)
        {
            try
            {
                WebAuthenticatorResult result = null;

                var authUrl = new Uri(AuthenticationUrl + scheme);
                var callbackUrl = new Uri("myapp://");
                result = await WebAuthenticator.AuthenticateAsync(authUrl, callbackUrl);
                
                AuthToken = string.Empty;

                if (result.Properties.TryGetValue("name", out var name) && !string.IsNullOrEmpty(name))
                {
                    AuthToken += $"Name: {name}{Environment.NewLine}";
                }

                if (result.Properties.TryGetValue("email", out var email) && !string.IsNullOrEmpty(email))
                {
                    AuthToken += $"Email: {email}{Environment.NewLine}";
                }
                
                AuthToken += result?.AccessToken ?? result?.IdToken;
                IsAuthenticated = true;
            }
            catch (Exception ex)
            {
                AuthToken = string.Empty;
            }
        }
    }

我也有一些后端代码。所有这一切都很好,我得到了访问令牌、用户 ID 等等。但我还有一些问题。

验证登录是否仍然有效的正确方法是什么?我应该如何授权应用操作?我该如何实现注销?

我将不胜感激建议或链接。

4

1 回答 1

0

作为用户,您不希望每次使用应用程序时都必须登录。幸运的是,MSAL已经缓存了您的授权,如果它仍然有效,可以让您静默登录。正确验证后,我们会收到一个访问令牌,随后我们可以使用它来查询受MSAL保护的其他 API 。

退出非常简单。我们检查了MSAL为我们在本地缓存的所有可用帐户并将它们注销。我们还会在登录时清除我们存储在安全存储中的访问令牌。

public async Task<bool> SignOutAsync()
{
  try
  {
    var accounts = await _pca.GetAccountsAsync();

    // Go through all accounts and remove them.
    while (accounts.Any())
    {
        await _pca.RemoveAsync(accounts.FirstOrDefault());
        accounts = await _pca.GetAccountsAsync();
    }

    // Clear our access token from secure storage.
    SecureStorage.Remove("AccessToken");

    return true;
  }
  catch (Exception ex)
  {
    Debug.WriteLine(ex.ToString());
    return false;
  }
}
于 2021-01-26T06:23:20.613 回答