Search code examples
c#oauthrestsharpetsy

Access Etsy API oauth using c# RestSharp


I set up a developer acct under our shop, to access our sales receipts. I decided to use RestSharp to make my requests. I have proved it works for none Oauth required calls. I have successfully received my accessToken and accessTokenSecret. So i use those along with the customerKey and customerSecret to make a ForProtectedResource call, for a oauth request as follows but always receive "This method requires authentication".

I'm hoping its something simple I'm missing. I thought, all I need to make any call are those four items correct? Once I have those four items I don't have to request or access token anymore, correct? Thanks

        var access_token = "#########################";
        var access_token_secret =  "########";

        var baseUrl = "https://openapi.etsy.com/v2";
        var client = new RestClient(baseUrl);
        client.Authenticator = OAuth1Authenticator.ForProtectedResource(consumerKey,
                                                      consumerSecret,
                                                      access_token,
                                                      access_token_secret);


        var request = new RestRequest("shops/########/receipts");
        request.Method = Method.GET;
        request.AddParameter("api_key", consumerKey);

       client.ExecuteAsync(request, response =>
        {
            var r = response;
        });

Solution

  • After some trial and error I finally wrapped my head around OAuth and the way Etsy implements it. The api_key parameter is only to be used when you're calling a none OAuth required method. Otherwise you have to send it all the required OAuth params. Below is working code. I leveraged RestSharp, as well as this OAuth base I found here. Hope this help some poor sap from staring at crappy code for 3 days (like yours truly).

            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 + MethodLocation), consumerKey, consumerSecret, Accesstoken, AccessTokenSecret, "GET", timeStamp, nonce, out normalizedUrl, out normalizedRequestParameters);
           // sig = HttpUtility.UrlEncode(sig);
    
    
            var request = new RestRequest(MethodLocation);
            request.Resource = string.Format(MethodLocation);
            request.Method = Method.GET;
           // request.AddParameter("api_key", consumerKey);
            request.AddParameter("oauth_consumer_key", consumerKey);
            request.AddParameter("oauth_token", Accesstoken);
            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);
    
            restClient.ExecuteAsync(request, response =>
            {
                var r = response;
            });