c# - 在 Etsy API 中执行经过身份验证的请求
问题描述
我正在创建一个概念证明,它通过 C# 和 Angular 来利用 Etsy API。
我目前在对 Etsy API 执行经过身份验证的请求时遇到问题,并在请求经过身份验证的用户的个人资料时收到以下响应:
“没有登录用户;请指定一个用户 ID”
下面是我正在调用的控制器操作。
您会注意到 if__SELF__
是作为userId
调用身份验证代码的 传入的。否则将跳过该代码。
当我传入有效的用户名/ID 时,我能够检索用户个人资料。
[HttpGet("{userId}")]
public async Task<IActionResult> UserProfile(string userId)
{
string requestUrl = String.Format("https://openapi.etsy.com/v2/users/{0}/profile?api_key={1}", userId, AccountController.ConsumerKey);
string token = Request.Headers["Access_Token"];
string tokenSecret = Request.Headers["Access_Verifier"];
if (userId.Equals("__SELF__"))
{
var client = new OAuthRequest
{
Method = "GET",
Type = OAuthRequestType.ProtectedResource,
SignatureMethod = OAuthSignatureMethod.HmacSha1,
ConsumerKey = AccountController.ConsumerKey,
ConsumerSecret = AccountController.ConsumerSecret,
Token = token,
TokenSecret = tokenSecret,
RequestUrl = requestUrl,
};
requestUrl += "&" + client.GetAuthorizationQuery();
}
using (HttpClient client = new HttpClient())
using (HttpResponseMessage res = await client.GetAsync(requestUrl))
using (HttpContent content = res.Content)
{
string data = await content.ReadAsStringAsync();
if (data != null)
{
try
{
UserModel userInfo = JsonConvert.DeserializeObject<UserModel>(data);
if (userInfo != null && userInfo.Count == 1 && userInfo.Results != null && userInfo.Results.Count == 1)
{
return Ok(userInfo.Results[0]);
}
}
catch (Exception)
{
return NotFound(data);
}
}
return NotFound();
}
}
我假设我在这里错误地利用了 OAuth 特定代码。我已经尝试使用来自客户端的令牌和验证器以及令牌和令牌机密,但似乎都没有工作。
解决方案
当使用 OAuth 凭据发出请求时,我可以通过从请求 uri 中删除 api 密钥来解决此问题。
string requestUrl = String.Format("https://openapi.etsy.com/v2/users/{0}/profile", userId);
if (userId.Equals("__SELF__"))
{
var client = new OAuthRequest
{
Method = "GET",
Type = OAuthRequestType.ProtectedResource,
SignatureMethod = OAuthSignatureMethod.HmacSha1,
ConsumerKey = AccountController.ConsumerKey,
ConsumerSecret = AccountController.ConsumerSecret,
Token = token,
TokenSecret = tokenSecret,
RequestUrl = requestUrl,
};
requestUrl += "&" + client.GetAuthorizationQuery();
} else {
requestUrl += String.Format("?api_key={0}", AccountController.ConsumerKey);
}
推荐阅读
- python - 如何在没有一堆 if 语句的情况下使用 python 3.6 在 pygame 中拥有不同的“菜单”?
- javascript - AngularJS ng-show 和 ng-hide 在 $http 调用后不会改变状态
- reactjs - 在 React 中切换按钮组
- admob - 如何从 ConsentForm 创建实例
- android - 添加片段时不显示抽屉和工具栏
- docker - 从命令行指定 dockerignore
- php - 更好的编码方式 Country > Region > City
- java - Lucene BooleanQuery OR 输出不是想要的
- python-3.6 - Python PEP 484 类型提示 -> 返回类型是类名还是无?
- haskell - 如何在haskell的列表中使用高阶函数?