问题描述
我正在创建一个概念证明,它通过 C# 和 Angular 来利用 Etsy API。
我目前在向 Etsy API 执行经过身份验证的请求时遇到问题,并在请求经过身份验证的用户的个人资料时收到以下响应:
下面是我正在调用的控制器操作。
您会注意到,如果将 __SELF__
作为 userId
传入,则会调用身份验证代码。否则该代码将被跳过。
[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);
}