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



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

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

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

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

然后,我有一个控制台应用程序(最终是一个服务),当我们有一个与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>

任何人都可以帮助或建议我应该坚持什么以便能够代表用户发布 - 一旦他们从服务或控制台应用程序授予我们权限。

提前谢谢。

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

使用它,我然后重新添加了框架,我认为我现在正确地使用它。因为一切都有效。

我的

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

但是,每次我尝试

发布时,我都尝试交换请求令牌值 + 机密和验证程序以获取访问令牌。这最终会失败。

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

最新更新