无法使用 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 进行服务。我可以执行 requestToken
和 authorize
步骤,但是当我调用 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 访问令牌授权角色