当前位置: 首页 > 知识库问答 >
问题:

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

符风畔
2023-03-14

我正在尝试授权我使用 OAuth 1.0a 进行服务。我可以执行请求令牌和授权步骤,但是当我调用访问令牌 URL 时,我收到 401 未授权响应,并显示以下消息:
OAuth 验证失败:无法将请求令牌“THE_TOKEN”交换为访问令牌。没有此类令牌或未授权%

我已经屏蔽了凭证和URL。

请求令牌 URL:https://url-to-the-service.com/oauth/requestToken
授权令牌 URL: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

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=真

然后我将此输入到我的浏览器中:

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

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

https://url-to-the-service.com/oauth/authorize?yes=1

最后,我向< code > https://URL-to-the-service . com/oauth/access token 发出请求,将< code>oauth_verifier和令牌机密添加到< code>oauth_signature中:

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验证失败:无法将请求令牌“the_token”交换为访问令牌。无此类令牌或未授权%

那么我错过了什么?

共有2个答案

鱼恩
2023-03-14

看起来您正在您的 cURL 请求中强制实施 GET 请求。尝试如下开机自检请求:

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 文档。此处引用以下内容以供参考:

代币交换

授权的最后一步是将临时凭证(请求令牌)交换为长期凭证(也称为访问令牌)。该请求还会破坏临时凭证。

通过将 POST 请求发送到令牌请求终结点(通常为 /oauth1/access),临时凭证将转换为长期存在的凭证。此请求必须由临时凭证签名,并且必须包含授权步骤中的oauth_verifier令牌。

夏侯俊美
2023-03-14

根据rfc5849 3.2验证请求

当收到具有无效客户端凭据、无效或过期令牌、无效签名或无效或已用 nonce 的请求时,服务器应返回 401(未经授权)状态代码

我不确定步骤1中的值< code > XO auth _ token _ TTL = 3600 是分钟还是秒钟。如果是秒,则1516721112处的第一个请求和1516730938处的访问令牌请求已经过期。(1516730938 - 1516721112 = 9826)

 类似资料:
  • 我在谷歌日历API工作。 问题是当使用刷新令牌时,我得到的是“请求失败:未授权(401)”(刷新令牌是因为用户不应该每次都需要登录) 对于在用户首次授权应用程序后检索的正常访问令牌(未过期),它可以正常工作。 下面是运行时url,它只在不使用刷新的访问令牌之前工作。

  • 我使用隐式授权流将Spotify API与AngularJS结合使用,但我不能使用access_token。 我以这种方式实现了隐性拨款流: 当我上网址时,我被很好地重定向到Spotify认证,但当我连接时,浏览器进入重定向循环:Spotify将我重定向到localhost/~mathieu这将我重定向到Spotify等… 我想在Spotify重定向我之后,我的脚本无法获取令牌,所以我再次被重定向

  • 客户端通过使用按附录B“application/x-www-form-urlencoded”格式在HTTP请求实体正文中发送下列UTF-8字符编码的参数向令牌端点发起请求: grant_type 必需的。值必须设置为“client_credentials”。 scope 可选的。如3.3节所述的访问请求的范围。 客户端必须如3.2.1所述与授权服务器进行身份验证。 例如,客户端使用传输层安全发起如

  • 客户端通过使用按附录B“application/x-www-form-urlencoded”格式在HTTP请求实体正文中发送下列UTF-8字符编码的参数向令牌端点发起请求: grant_type 必需的。值必须设置为“password”。 username 必需的。资源所有者的用户名。 password 必需的。资源所有者的密码。 scope 可选的。如3.3节所述的访问请求的范围。 如果客户端类

  • 客户端通过使用按附录B“application/x-www-form-urlencoded”格式在HTTP请求实体正文中发送下列UTF-8字符编码的参数向令牌端点发起请求: grant_type 必需的。值必须被设置为“authorization_code”。 code 从授权服务器收到的授权码。 redirect_uri 必需的,若“redirect_uri”参数如4.1.1节所述包含在授权请求

  • 我应该做些什么来让这个API调用按预期使用cURL工作?