首页 > 解决方案 > 在 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 特定代码。我已经尝试使用来自客户端的令牌和验证器以及令牌和令牌机密,但似乎都没有工作。

标签: c#angularapietsy

解决方案


当使用 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); 
            }

            



推荐阅读