2

我正在添加通过一个简单的应用程序将待办事项发布到我的 Todist 列表的功能。目前,"error"=>"invalid_grant"当我将代码交换为 access_token 时,我得到了响应。

我不确定在这种情况下“invalid_grant”到底指的是什么。我发现的其他答案似乎与各种 Google API 有关。Todoist API 文档没有提及它。

代币兑换的post请求是:

uri = URI('https://todoist.com/oauth/access_token')
result = Net::HTTP.post_form(uri, client_id: ENV['TODOIST_CLIENT_ID'], client_secret: ENV['TODOIST_CLIENT_SECRET'], code: params[:code])
json_body = JSON.parse(result.body) # <- prints error

非常感谢任何理解和解决此问题的帮助。

更新

阅读 Takahiko Kawasaki 的回答后,我已将请求更新为以下内容,但有相同的错误消息。

uri = URI('https://todoist.com/oauth/access_token')
data = {
  :client_id => ENV['TODOIST_CLIENT_ID'],
  :client_secret => ENV['TODOIST_CLIENT_SECRET'],
  :code => params[:code],
  :grant_type => 'authorization_code',
}
result = Net::HTTP.post_form(uri, data)
json_body = JSON.parse(result.body)
4

2 回答 2

1

添加以下内容。

grant_type: 'authorization_code'

参见 RFC 6749, 4.1.3。访问令牌请求以获取详细信息。


对修改后的问题的附加评论。

看来 Todoist 的 OAuth 实现并不成熟。我查看了他们的API 文档,很快就发现了一些违反RFC 6749的行为。

例如,(1)范围必须用空格分隔,但他们的文档说应该使用逗号。(2) 他们的令牌端点不需要grant_type请求参数,这是规范要求的。(3)error来自令牌端点的响应中的参数值应该是invalid_grant当提供的授权码错误时,但他们的 API 文档说该值将是bad_authorization_code,这不是官方值。

此外,这不是违规行为,但他们撤销访问令牌的 API 规范意味着他们不知道访问令牌撤销的官方规范RFC 7009的存在。

对于公共客户端(RFC 6749, 2.1. Client Types),例如智能手机应用程序,client_secret令牌端点的请求参数应该是可选的,但他们的 API 文档说它是必需的。

因为他们的 OAuth 实现不符合规范,你最好直接询问 Todoist。

于 2016-05-11T12:25:17.430 回答
0

最新版本的 Todoist API (v8) 不需要该grant_type参数,因此目前这不是问题。

收到错误的两个可能原因invalid_grant是:

  1. code一定时间内未使用,已过期
  2. code用于生成访问令牌,因此不再有效

code在这两种情况下,在发出 POST 请求之前生成一个新的应该对问题进行排序。

于 2019-06-20T21:19:28.173 回答