我正在尝试使用 ASP.NET 5 (rc1-final)、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()
我确实读过here对于某些 OAuth 端点(即 Yahoo),他们不喜欢 localhost。因此,我尝试使用本地主机,并将主机文件修改为不同的域。我已确保我传入的重定向网址是在 FitBit 上为应用程序注册的网址。
此错误来 self 的网站,并且已达到将代码交换为访问 token 的程度。我打开了 fiddle 手,我有点迷失了从这里去哪里。我正在 http 上运行(因为这是本地开发,而且我还没有 ssl 证书),但我不完全确定这是否重要。
最佳答案
默认情况下,OAuth2 通用中间件通过在请求表单中传递客户端凭据来发送客户端凭据(使用 application/x-www-form-urlencoded
进行编码)。
遗憾的是,Fitbit 仅支持基本身份验证:由于凭据未在 Authorization
header 中流动,Fitbit 将您的 token 请求视为未经身份验证并拒绝它。
幸运的是,这是专门的 Fitbit 社交提供商(内部基于 OAuth2 通用中间件)将为您处理的事情:https://www.nuget.org/packages/AspNet.Security.OAuth.Fitbit/1.0.0-alpha3
app.UseFitbitAuthentication(options => {
options.ClientId = "230H9";
options.ClientSecret = "ae7ff202cg5z42d85a3041fdc43c9c0b2";
});
关于c# - 在 ASP.NET 5 中使用通用 OAuth 中间件时出现 401 未经授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34615749/