gpt4 book ai didi

c# - Etsy oauth 身份验证 c# RestSharp

转载 作者:太空狗 更新时间:2023-10-29 21:08:36 27 4
gpt4 key购买 nike

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

我用了this SO answer连同 OAuth basebenSharper链接到。

我看过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
}
}

如有任何帮助,我们将不胜感激。

最佳答案

弄清楚我错过了什么。我失踪了Obtaining Token Credentials ,这是您访问 protected 资源所需的永久 token 。

我无法同时理解 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,提供回调URL。回调将有两个查询参数 oauth_tokenoauth_verifier。这是回调函数签名的示例:

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

  3. 将返回的 token 和 secret 保存在映射结构中以供以后检索。

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

关于c# - Etsy oauth 身份验证 c# RestSharp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26954935/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com