401在ASP.NET 5中使用通用OAuth中间件时未经授权
本文关键字:中间件 OAuth 授权 NET ASP | 更新日期: 2023-09-27 18:29:01
我正试图使用ASP.NET 5(rc1最终版本)、Identity和MS.AspNet.Authentication.OAuth中间件将我正在构建的网站连接到FitBit。我打算使用OAuth 2.0的授权授予流。我在FitBit上设置了应用程序(详细信息如下),我的Startup.cs看起来像:
app.UseIdentity();
app.UseOAuthAuthentication(options =>
{
options.AuthenticationScheme = "FitBit-AccessToken";
options.AuthorizationEndpoint = "https://www.fitbit.com/oauth2/authorize";
options.TokenEndpoint = "https://api.fitbit.com/oauth2/token";
options.SaveTokensAsClaims = true;
options.CallbackPath = new PathString("/signing-fitbit-token/");
options.ClientId = "[MY ID STRIPPED OUT]";
options.ClientSecret = "[MY SECRET STRIPPED OUT]";
options.DisplayName = "FitBit";
options.Scope.Add("activity");
options.Scope.Add("heartrate");
options.Scope.Add("location");
options.Scope.Add("nutrition");
options.Scope.Add("profile");
options.Scope.Add("settings");
options.Scope.Add("sleep");
options.Scope.Add("social");
options.Scope.Add("weight");
options.AutomaticAuthenticate = true;
});
当我单击登录按钮时,我将被引导到FitBit上的授权页面,但当我单击授权时,我会看到ASP.NET开发错误页面:
An unhandeled exception occurred while processing the request.
HttpRequestException: Response status code does not indicate success: 401 (Unauthorized)
System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()
我在这里读到,对于一些OAuth端点(即Yahoo),他们不喜欢localhost。因此,我尝试了使用localhost和将主机文件修改到不同的域。我已经确保我传递的重定向url是在FitBit为应用程序注册的url。
这个错误来自我的网站,并且已经到了将代码交换为访问令牌的地步。我有小提琴手,我有点不知所措,不知道从这里往哪里走。我在http上运行(因为这是本地开发,我还没有ssl证书),但我不完全确定这是否重要。
默认情况下,OAuth2通用中间件通过在请求表单中流动客户端凭据(使用application/x-www-form-urlencoded
编码)来发送客户端凭据。
遗憾的是,Fitbit只支持基本身份验证:由于凭证没有在Authorization
标头中流动,Fitbit将您的令牌请求视为未经身份验证并拒绝它。
幸运的是,这是专门的Fitbit社交提供商(内部基于OAuth2通用中间件)将为您处理的事情:https://www.nuget.org/packages/AspNet.Security.OAuth.Fitbit/1.0.0-alpha3
app.UseFitbitAuthentication(options => {
options.ClientId = "230H9";
options.ClientSecret = "ae7ff202cg5z42d85a3041fdc43c9c0b2";
});
对FitBit的OAuth请求出现问题,您需要调试该请求,并查看为什么从FitBit返回401。