无效/过期令牌 - 401 - 使用Spring.Social.Twitter进行未授权(需要授权)

时间:2014-11-26 14:21:31

标签: c# api twitter twitter-oauth spring-social-twitter

我正在使用Spring.Net Framework(spring.rest,spring.social.core和spring.social.twitter(2.x - oauth 1.0a)和c#。

该应用程序的想法将是一个事件,人们可以将他们的Twitter帐户链接到事件,并收到该人的结果。这些人将其发布到他们的推特账户。

它将由一个用户注册并提供访问权限的网站组成。然后是一个控制台应用程序,它将处理结果(使用保存的令牌集发布给注册用户。

我有一个web mvc应用程序,要求用户登录并授权应用程序,以便它可以代表用户发布。返回的此信息(令牌等)已加密并保存在链接到用户的数据库中。例如我们的网站 - 重定向到回调网址 - 推特 - 登录+权限 - 回到回调网址 - 以db加密存储令牌信息。

然后我有一个控制台应用程序(最终是一个服务)查看结果,当我们得到一个与Twitter帐户关联和给予权限的人的结果。我们使用该信息发布到他们的帐户(他们的结果)。

注册过程正常,我可以发布给已注册的人。说他们已经注册了。 (网站)

控制台应用程序最初能够发布结果。

但是,我突然得到了(我认为这只是一个时间范围(大约一个小时) - 很快就可以注册。)

“对'https://api.twitter.com/oauth/access_token'的POST请求导致401 - 未经授权(需要授权)。”

链接到用户(在我们的系统中) - 我正在加密和存储验证者(来自回调),秘密和价值。然后我使用它来交换访问令牌以获取秘密和值以便能够发布。

目前这是一个演示(转到127.0.0.1)以进行概念验证。 到目前为止,只使用Spring.Social框架(c#)

尝试了所有这些

当它通过控制台应用程序工作时 - RAW -

REQUEST
POST https://api.twitter.com/oauth/access_token HTTP/1.1
Accept: application/x-www-form-urlencoded,multipart/form-data,/
Authorization: OAuth oauth_consumer_key="xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
, oauth_signature_method="HMAC-SHA1"
, oauth_timestamp="1417007918"
, oauth_nonce="1784014115"
, oauth_version="1.0"
, oauth_token="yyyyyyyyyyyyyyyyyyyyyyyyyyy"
, oauth_verifier="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
, oauth_signature="vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv"
Content-Type: application/x-www-form-urlencoded
Host: api.twitter.com
Content-Length: 0
Connection: Keep-Alive

RESPONSE
HTTP/1.1 200 OK
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
content-length: 167
content-security-policy: default-src https:; connect-src https:; font-src https: data:; frame-src https:; img-src https: data:; media-src https:; object-src https:; script-src 'unsafe-inline' 'unsafe-eval' https:; style-src 'unsafe-inline' https:; report-uri https://twitter.com/i/csp_report?a=NVXW433SMFUWY%3D%3D%3D&ro=false;
content-type: text/html; charset=utf-8
date: Wed, 26 Nov 2014 13:18:40 UTC
etag: "fbf12c0103c8a9a4e85476ebc4a721fb"
expires: Tue, 31 Mar 1981 05:00:00 GMT
last-modified: Wed, 26 Nov 2014 13:18:39 GMT
pragma: no-cache
server: tsa_b
set-cookie: twittersess=BAh7BzoPY3JlYXRlZF9hdGwrCAnzQOxJAToHaWQiJTZjODM4ZWMwZDg4ZjY0%250ANGFjYWE0N2M1YWU0MmMzNmZl--af2ffe955256e30da84bc52b585d7c30b6926284; domain=.twitter.com; path=/; secure; HttpOnly
set-cookie: guest_id=v1%3A141700791973784560; Domain=.twitter.com; Path=/; Expires=Fri, 25-Nov-2016 13:18:40 UTC
status: 200 OK
strict-transport-security: max-age=631138519
vary: Accept-Encoding
x-connection-hash: bd73d7f87abb9c16caef67f675d8641b
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-mid: 4e5118e4376219e001674f1292c123965885210f
x-runtime: 0.10480
x-transaction: d24c3b12ea39be37
x-ua-compatible: IE=edge,chrome=1
x-xss-protection: 1; mode=block

oauth_token=xxxxx-xxxxxxxxxxxxxxxxxxxxxx&oauth_token_secret=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy&user_id=2xxxxxxxxxxxxxx&screen_name=naxxxxxx

大约一个小时后(在这种情况下几个小时)相同的代码将失败....需要HTTP / 1.1 401授权 - 无效/过期令牌。

REQUEST
POST https://api.twitter.com/oauth/access_token HTTP/1.1
Accept: application/x-www-form-urlencoded,multipart/form-data,*/*
Authorization: OAuth oauth_consumer_key="xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
, oauth_signature_method="HMAC-SHA1"
, oauth_timestamp="1417018992"
, oauth_nonce="2294192392"
, oauth_version="1.0"
, oauth_token="yyyyyyyyyyyyyyyyyyyyyyyyyyy"
, oauth_verifier="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
, oauth_signature="vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv"
Content-Type: application/x-www-form-urlencoded
Host: api.twitter.com
Content-Length: 0
Connection: Keep-Alive

RESPONSE
HTTP/1.1 401 Authorization Required
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
content-length: 136
content-security-policy: default-src https:; connect-src https:; font-src https: data:; frame-src https:; img-src https: data:; media-src https:; object-src https:; script-src 'unsafe-inline' 'unsafe-eval' https:; style-src 'unsafe-inline' https:; report-uri https://twitter.com/i/csp_report?a=NVXW433SMFUWY%3D%3D%3D&ro=false;
content-type: text/html; charset=utf-8
date: Wed, 26 Nov 2014 16:23:13 UTC
expires: Tue, 31 Mar 1981 05:00:00 GMT
last-modified: Wed, 26 Nov 2014 16:23:13 GMT
pragma: no-cache
server: tsa_b
set-cookie: _twitter_sess=BAh7CDoPY3JlYXRlZF9hdGwrCEzs6exJAToHaWQiJWI5MDgzMzk0Y2FhMGY2%250AMGNlNmEyYzQzZjk5OGEyNjAyIgpmbGFzaElDOidBY3Rpb25Db250cm9sbGVy%250AOjpGbGFzaDo6Rmxhc2hIYXNoewAGOgpAdXNlZHsA--86562a75e3ddabab3c688e726e6c42fe37a067ea; domain=.twitter.com; path=/; secure; HttpOnly
set-cookie: guest_id=v1%3A141701899357688419; Domain=.twitter.com; Path=/; Expires=Fri, 25-Nov-2016 16:23:13 UTC
status: 401 Unauthorized
strict-transport-security: max-age=631138519
vary: Accept-Encoding
www-authenticate: OAuth realm="https://api.twitter.com"
x-connection-hash: 24d849ec3bead25133b581794d34c74f
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-mid: aed281dc4b2e3fb483737ccd772ce1d8d3f6064d
x-transaction: d41ff14981c7a0ec
x-ua-compatible: IE=edge,chrome=1
x-xss-protection: 1; mode=block

<?xml version="1.0" encoding="UTF-8"?>
<hash>
  <error>Invalid / expired Token</error>
  <request>/oauth/access_token</request>
</hash>

任何人都可以帮助或建议我应该坚持代表用户发布的内容 - 一旦他们从服务或控制台应用程序中获得了我们的许可。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我成功解决了问题。我从等式中删除了Spring.Social并编写了一些快速代码,以便在没有框架的情况下与Twitter API交谈,这让我更好地理解了步骤和过程是什么。

使用这个我然后重新添加框架,我想我现在正确使用它。一切正常。

我的问题是,一旦我得到了我的请求令牌+验证者 - 提供回调,消费者等我然后用它来获取访问令牌来执行帖子等。

但是,每次我尝试发布时,我都尝试交换请求令牌值+ secret和verifier来获取访问令牌。这最终失败了。

我更改了代码以保存返回的访问令牌并直接使用它,现在工作正常。