我正在构建一个 Xamarin.Forms 应用程序来学习框架并在将 Azure 应用程序服务用于 API 时使用身份验证服务(对我来说也是新的)。并尝试针对 Microsoft 帐户 (Outlook.com) 进行身份验证。
我正在使用 Xamarin.Auth OAuth2Authenticator 类,它返回一个非常奇特、格式错误的 JWT 令牌。这让我发疯了好几天,最后决定转向专家所在的地方。
我有一个 IAuthService 接口,平台应用程序将使用它来构建身份验证服务
public interface IAuthService
{
Task SignInAsync(string clientId,
Uri authUrl,
Uri callbackUrl,
Action<string> tokenCallback,
Action<string> errorCallback);
}
所述服务(适用于 iOS)构建如下(为简洁起见):
public class AuthService : IAuthService
{
public async Task SignInAsync(string clientId, Uri authUrl, Uri callbackUrl, Action<string> tokenCallback, Action<string> errorCallback)
{
var auth = new OAuth2Authenticator(clientId, "openid", authUrl, callbackUrl);
auth.AllowCancel = true;
var controller = auth.GetUI();
await UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewControllerAsync(controller, true);
auth.Completed += (s, e) =>
{
controller.DismissViewController(true, null);
if (e.Account != null && e.IsAuthenticated)
{
Console.WriteLine(e.Account.Properties["access_token"]);
tokenCallback?.Invoke(e.Account.Properties["access_token"]);
}
else
{
errorCallback?.Invoke("Not authenticated");
}
};
...
}
}
所以我实例化了一个 OAuth2Authenticator 类的新实例,指定范围为“openid”;MS 授权端点需要一个范围。
当它到达控制台写入行时,我可以看到一个值回来了……但它不像我以前见过的任何 JWT 令牌。
EwB4A8l6BAAURSN/FHlDW5xN74t6GzbtsBBeBUYAAWPAOehpFaoAKb8Kz67ZZzgzBS3KUtHGZri2sbgIJfA5xZYDv5K417HIz2P+ggUeB/gFMxRfXH1Hd1qT90bfo6skGpIc/K2vDgBoRY0VnlA9nnCyct9B2tSaNQn3hZjPOiOchmSCJxrUMILGKdKy4kxxn5qFlTXAy0hWIQjHXcwGeKXDm1w3wY6x8xsmBxNNXor9FluuUXNNTtu4iP6s424JwIiJ7HCyu6ftORXCfIlemRSv5hcHLa1MXS9vUq95lRc08S05Ek7IiUfMiAnYbrqwD7H+vheAtfDc9kYleebyxlFl6gpVKmv43DV2yYgYIqgqswO6ktJ6Gar4zmqUYUIDZgAACGWNlS0Ln+wWSAJC2apVPWWIsKPobIL0uBImdORjOWvFOnLtKhQfCnngoo1Tw1UItqo5FRj1f/KWj3if/DPgWaQx5Bf4tbqCjuuOdEkR9r/Ru1v/ccjrg2oqp0hicWwIoSaQm2JHgnrrCQ1cfcvXhAuVlAo9tKyqW/dCehdz7NRpQbNtmLvba+PjWWYEcDROJJSwTRqNTGkwiwzNhw8p/Zlf7G51F205S4vDZob1MsWythkrUJAjA6MUJy4wZ5B/8ChF7J3WRSTapjr+6mNgvgvhcflGo6GoEID24aSDL6h9QGPylk6zfghksweu9/AmSMO4BKwLDVSr04BJj1n1rfKsadUBqWUQMaXFGu+OfGbOCm6E5zLSJyO2JKbcsI468gb0/vC6FYFJOzp56GXD5brQtKNtu9urtge02kOwaGlHsK2I28BMdCRVFYJI9kEiqhqr342ZDlob7mpBCoNDk1uLLH2MPDAW9NOpq+V0bab+WawINAjl1GY/obL3zRsVNMoAszFSfdbbWS/KDbx6rw5bUPMC37s6LTbECkXHhqeqDlNQs4G9BccfiJNI5CQa+QPmaRNOBKhD2K97Z9fXmAFY155WzTPoIVKupxkPXo0zp/9vOc/HHEtMlkoUUNzxX5Q7T8awfN/7F4IfShXQKEVLaIStdx5istw7rxfuv1v/U+EMj4fmYUW9sNG/5irVyGAAOVvvPNkavLnl+NaKYysvAxYVPlrj+zJIDi5C91MmRhiTfH/Lgyq9Mlr/FaLIa/Ow6rCIjO4oBZSl9dXwLxFI4oQC
它没有被编码/解码。
我正在使用的 authUrl 是 https://login.microsoftonline.com/common/oauth2/v2.0/authorize 如果我尝试使用授权端点的 v1.0,手机操作系统似乎会向我抛出一个错误,说明身份验证错误 - 来自服务器的无效状态。可能伪造!
我已经设置了一个 Azure App Service 作为我的 API,如果我直接点击我的应用登录 url,它会给我一个格式正确的令牌,然后我可以使用它毫无问题地点击 api。所以这告诉我我的 cliend_id 是正确的,一切都应该工作。
所以我在某处做错了。我不知道在使用 MS 帐户时是否信任 Xamarin 的 OAuth2Authenticator 类。但是文档很旧和/或缺少。我觉得这将是一个简单的答案,但我正在尝试解释 MS/Xamarin/Googled 文档。