【问题标题】:Etsy oauth authentication c# RestSharpEtsy oauth 身份验证 c# RestSharp
【发布时间】:2015-01-13 07:36:16
【问题描述】:

我正在尝试执行documentation 中给出的示例授权请求(或任何需要身份验证的 Etsy api)。我得到的响应是“oauth_problem=token_rejected”。

我使用了this SO answer 以及benSharper 链接到的OAuth base

我看过thisthis 等。其中一个使用了https://sandbox.https://openapi.etsy.com/v2,当我尝试这样做时,异常是“底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。”我部署到我的服务器(即 https)并且仍然是相同的响应。

似乎无法让它发挥作用。我错过了什么?

这是我的代码:

public class AuthorizedRequestHelper
    {
        string baseUrl = "https://openapi.etsy.com/v2";
        string relativePath = "/oauth/scopes";
        string oauth_consumer_key = "xxx";
        string consumerSecret = "xxx";
        string oauth_token = "xxx";
        string oauth_token_secret = "xxx";

        public void test()
        {
            var restClient = new RestClient(baseUrl);
            OAuthBase oAuth = new OAuthBase();

            string nonce = oAuth.GenerateNonce();
            string timeStamp = oAuth.GenerateTimeStamp();
            string normalizedUrl;
            string normalizedRequestParameters;

            string sig = oAuth.GenerateSignature(new Uri(baseUrl + relativePath), oauth_consumer_key, consumerSecret, oauth_token, oauth_token_secret, "GET", timeStamp, nonce, out normalizedUrl, out normalizedRequestParameters);


            var request = new RestRequest(relativePath);
            request.Resource = string.Format(relativePath);
            request.Method = Method.GET;

            request.AddParameter("oauth_consumer_key", oauth_consumer_key);
            request.AddParameter("oauth_token", oauth_token);
            request.AddParameter("oauth_nonce", nonce);
            request.AddParameter("oauth_timestamp", timeStamp);
            request.AddParameter("oauth_signature_method", "HMAC-SHA1");
            request.AddParameter("oauth_version", "1.0");
            request.AddParameter("oauth_signature", sig);

            IRestResponse irestResponse = restClient.Execute(request);
            var content = irestResponse.Content;
            // content = oauth_problem=token_rejected
        }
    }  

任何帮助将不胜感激。

【问题讨论】:

    标签: c# api oauth etsy


    【解决方案1】:

    弄清楚我错过了什么。我错过了Obtaining Token Credentials,这是您访问受保护资源所需的永久令牌。

    我很难同时理解 OAuth、RestSharp 和 Etsy 的实现。不需要 OAuthBase,RestSharp 会处理它。

    请注意,使用 RestSharp 进行 OAuth 调用时,appKeysharedSecret 将变为 consumerKeyconsumerSecret

    这是工作代码:

        /// <summary>
        /// RestSharp documentation: https://github.com/restsharp/RestSharp/wiki
        /// </summary>
        public class Etsy_portal
        {
            Uri BASE_URL = new Uri("https://openapi.etsy.com/v2/");
    
            string appKey;
            string sharedSecret;
            RestClient restClient;
    
            private string[] _permissions_array;
            public string Permissions
            {
                get { return string.Join(" ", _permissions_array); }
            }
    
            public Etsy_portal(string appKey_, string sharedSecret_)
            {
                appKey = appKey_;
                sharedSecret = sharedSecret_;
    
                restClient = new RestClient(BASE_URL);
    
                //todo move permissions to Web.config
                _permissions_array = new string[] { "listings_r", "listings_w", "listings_d", "shops_rw" };
            }
    
            public string GetConfirmUrl(out string oauth_token, out string oauth_token_secret, string callbackUrl_ = null)
            {
                restClient.Authenticator = OAuth1Authenticator.ForRequestToken(appKey, sharedSecret, callbackUrl_ ?? "oob");
    
                RestRequest restRequest = new RestRequest("oauth/request_token", Method.POST);
    
                restRequest.AddParameter("scope", Permissions);
    
                IRestResponse response = restClient.Execute(restRequest);
    
                if (response.StatusCode != System.Net.HttpStatusCode.OK)
                {
                    oauth_token = null;
                    oauth_token_secret = null;
                    return null;
                }
    
                NameValueCollection queryString = System.Web.HttpUtility.ParseQueryString(response.Content);
    
                oauth_token = queryString["oauth_token"];
                oauth_token_secret = queryString["oauth_token_secret"];
    
                return queryString["login_url"];
            }
    
            public void ObtainTokenCredentials(string oauth_token_temp_, string oauth_token_secret_temp_, string oauth_verifier_, out string permanent_oauth_token_, out string permanent_oauth_token_secret_)
            {
                //consumerKey is the appKey you got when you registered your app, same for sharedSecret
                restClient.Authenticator = OAuth1Authenticator.ForAccessToken(appKey, sharedSecret, oauth_token_temp_, oauth_token_secret_temp_, oauth_verifier_);
    
                RestRequest restRequest = new RestRequest("oauth/access_token", Method.GET);
                IRestResponse irestResponse = restClient.Execute(restRequest);
    
                NameValueCollection queryString = System.Web.HttpUtility.ParseQueryString(irestResponse.Content);
    
                permanent_oauth_token_ = queryString["oauth_token"];
                permanent_oauth_token_secret_ = queryString["oauth_token_secret"];
            }
    
            public string GetScopes(string accessToken_, string accessTokenSecret_)
            {
                restClient.Authenticator = OAuth1Authenticator.ForProtectedResource(appKey, sharedSecret, accessToken_, accessTokenSecret_);
    
                RestRequest restRequest = new RestRequest("oauth/scopes", Method.GET);
    
                IRestResponse irestResponse = restClient.Execute(restRequest);
    
                return irestResponse.Content;
            }
        }
    

    伪代码(带回调):

    1. 构造一个Etsy_portal 对象
    2. 致电GetConfirmUrl,提供回调网址。回调将有两个查询参数oauth_tokenoauth_verifier。下面是一个回调函数签名的例子:

      [HttpGet] public ActionResult EtsyCallback(string oauth_token, string oauth_verifier)

    3. 将返回的令牌和机密保存在映射结构中以供以后检索。

    4. 访问调用GetConfirmUrl返回的确认URL。
    5. 在回调函数中,使用提供的令牌(上例中的第一个参数)查找步骤 3 中保存的秘密。
    6. 使用验证器(上例中回调函数的第二个参数)、令牌和密钥,调用ObtainTokenCredentials 以获取永久令牌和密钥。
    7. 保存永久令牌和秘密,您可以丢弃步骤1-4中获得的验证者、临时令牌和临时秘密。

    【讨论】:

    • 如何在桌面应用中使用这个类?
    • 我把它放在一个类库中,这样我就可以在 Web 应用程序或桌面应用程序中使用它。当然,您需要添加适当的参考文献
    • “不需要 OAuthBase,RestSharp 可以解决这个问题。”您可以使用 restsharp 为签名请求制作 OAuth 签名吗? @MichaelTranchida
    • 我在实际发出经过身份验证的请求以创建 etsy 列表时遇到问题
    • @j.bhong 希望你已经弄清楚了你需要做什么,自从我处理 Etsy 的 API 以来已经过去了 2 年,所以我必须重新学习一切来帮助你。如果您还没有也无法弄清楚您需要做什么,请添加另一条评论,我会花一些时间看看是否可以解决您的问题。
    猜你喜欢
    • 2021-06-13
    • 2023-03-07
    • 1970-01-01
    • 2022-10-09
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2015-02-02
    相关资源
    最近更新 更多