2014-11-16 168 views
5

我正在嘗試執行示例授權請求(或任何需要身份驗證的Etsy的api)在其documentation中給出的示例。我得到的迴應是「oauth_problem = token_rejected」。Etsy oauth身份驗證c#RestSharp

我使用了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 
     } 
    } 

任何幫助將不勝感激。

回答

9

找出我失蹤的東西。我錯過了Obtaining Token Credentials,這是您需要訪問受保護資源的永久令牌。

難以一次性完成OAuth,RestSharp和Etsy的實現。不需要OAuthBase,RestSharp會照顧到這一點。

注意,appKeysharedSecret成爲consumerKeyconsumerSecret將OAuth時RestSharp調用。

這裏的工作代碼:

/// <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,提供一個回調URL。回調將有兩個查詢參數oauth_tokenoauth_verifier。這裏有一個回調函數簽名的例子:

    [HTTPGET]公衆的ActionResult EtsyCallback(串組oauth_token,串oauth_verifier)

  3. 保存返回的標記和祕密的地圖結構爲以後的檢索。

  4. 請訪問致電GetConfirmUrl返回的確認網址。
  5. 在回調函數中,使用提供的令牌(上例中的第一個參數)查找在步驟3中保存的密碼。
  6. 使用verifier(上述示例中的回調函數的第二個參數) ,令牌和祕密,請撥打ObtainTokenCredentials以獲得永久令牌和祕密。
  7. 保存永久令牌和祕密,您可以丟棄驗證者,臨時令牌和在步驟1-4中獲得的臨時祕密。
+0

如何在桌面應用程序中使用此類? – Volatil3

+0

我把它放在類庫中,這樣我就可以在Web應用程序或桌面應用程序中使用它。您需要添加適當的參考資料,當然 –

+0

「不需要OAuthBase,RestSharp照顧。」你可以使用restsharp爲已簽名的請求創建OAuth簽名嗎? @MichaelTranchida –