无法使用 OAuth 1.0a 授权我,请求访问令牌时失败

Posted

技术标签:

【中文标题】无法使用 OAuth 1.0a 授权我,请求访问令牌时失败【英文标题】:Cannot authorize me using OAuth 1.0a, failing when requesting an accesToken 【发布时间】:2018-07-02 16:28:56 【问题描述】:

我正在尝试授权我使用 OAuth 1.0a 进行服务。我可以执行 requestTokenauthorize 步骤,但是当我调用 accessToken URL 时,我会收到 401 Unauthorized 响应并返回以下消息:OAuth Verification Failed: Can't exchange request token "THE_TOKEN" for access token. No such token or not authorized%

我已经屏蔽了凭据和 URL。

请求令牌网址:https://url-to-the-service.com/oauth/requestToken 授权令牌网址:https://url-to-the-service.com/oauth/authorize 访问令牌 URL:https://url-to-the-service.com/oauth/accessToken

我从该服务获得的凭据如下:consumer_key = CONSUMER_KEY consumer_secret = CONSUMER_SECRET

第 1 步 - 请求临时令牌

curl -v -X GET --url "https://url-to-the-service.com/oauth/requestToken?oauth_version=1.0& \
oauth_timestamp=1516721112& \
oauth_nonce=25794& \
oauth_signature_method=PLAINTEXT& \
oauth_consumer_key=CONSUMER_KEY& \
oauth_signature=CONSUMER_SECRET%26"

服务然后响应:

oauth_callback_confirmed=true&oauth_token=THE_TOKEN&oauth_token_secret=THE_TOKEN_SECRET&xoauth_token_ttl=3600

第 2 步 - 使用临时令牌授权我并获得验证者

然后我在浏览器中输入这个:

https://url-to-the-service.com/oauth/authorize?oauth_token=THE_TOKEN

...它提示我登录服务。当我在登录后按下授权按钮时,我被转发到此 URL:

https://url-to-the-service.com/oauth/authorize?yes=1&oauthVerifier=123456789&oauth_token=THE_TOKEN

第 3 步 - 请求访问令牌

最后,我通过将oauth_verifier 和令牌秘密添加到oauth_signature 来向https://url-to-the-service.com/oauth/accessToken 发出请求:

curl -v -X GET --url "https://url-to-the-service.com/oauth/accessToken?oauth_version=1.0& \ 
oauth_timestamp=1516730938& \
oauth_nonce=30888& \
oauth_signature_method=PLAINTEXT& \
oauth_consumer_key=CONSUMER_KEY& \
oauth_signature=CONSUMER_SECRET%26THE_TOKEN_SECRET& \
oauth_token=THE_TOKEN& \
oauth_verifier=123456789"

但服务会回复:OAuth Verification Failed: Can't exchange request token "THE_TOKEN" for access token. No such token or not authorized%

那么我错过了什么?

【问题讨论】:

【参考方案1】:

根据rfc5849 3.2 Verifying Requests

服务器应该返回 401(未授权)状态 收到带有无效客户端凭据的请求时的代码, 令牌无效或过期签名无效无效或已使用 随机数

我不确定步骤 1 中的值 xoauth_token_ttl=3600 是分钟还是秒。如果是秒,1516721112的第一个请求和1516730938的访问令牌请求已经过期。 (1516730938 - 1516721112 = 9826)

【讨论】:

【参考方案2】:

您似乎在 cURL 请求中强制执行 GET 请求。尝试如下 POST 请求:

curl -v -X POST --url "https://url-to-the-service.com/oauth/accessToken?
oauth_version=1.0& \ 
oauth_timestamp=1516730938& \
oauth_nonce=30888& \
oauth_signature_method=PLAINTEXT& \
oauth_consumer_key=CONSUMER_KEY& \
oauth_signature=CONSUMER_SECRET%26THE_TOKEN_SECRET& \
oauth_token=THE_TOKEN& \
oauth_verifier=123456789"

请参阅OAuth1 documentation。在此引用以供参考:

代币兑换

授权的最后一步是交换临时 凭证(请求令牌)用于长期凭证(也称为 访问令牌)。这个请求也破坏了临时 凭据。

临时凭证通过以下方式转换为长期凭证 向令牌请求端点发送 POST 请求(通常 /oauth1/访问)。此请求必须由临时签名 凭据,并且必须包含来自 授权步骤。

【讨论】:

以上是关于无法使用 OAuth 1.0a 授权我,请求访问令牌时失败的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 资源服务器无法使用 oAuth 2 访问令牌授权角色

OAuth 2.0 开放授权原理

OpenID Connect Core 1.0使用授权码流验证(下)

OAuth 2.0 授权码请求

开放平台OAuth 2.0授权开发实践

OAuth 中的 CORS:对预检请求的响应未通过访问控制检查