我正在添加通过一个简单的应用程序将待办事项发布到我的Todist列表的功能。目前,当我将代码转换为一个"error"=>"invalid_grant"时,我将得到响应access_token。
在这种情况下,我也不清楚“invalid_grant”到底指的是什么。我发现的其他答案似乎是关于各种Google的。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任何帮助理解和解决这一点都是非常感谢的。
更新
在阅读川崎高彦的答案后,我更新了请求如下,但有相同的错误信息。
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)发布于 2016-05-11 12:25:17
添加以下内容。
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_secret请求参数应该是可选的,但是他们的API文档表示它是必需的。
因为它们的OAuth实现不符合规范,所以最好直接询问Todoist。
发布于 2019-06-20 21:19:28
最新版本的Todoist API (v8)不需要grant_type参数,因此目前不是问题所在。
接收invalid_grant错误的两个可能原因是:
code没有在一定的时间内使用,并且已经过期。code已用于生成访问令牌,因此不再有效。在这两种情况下,在发出POST请求之前生成一个新的code应该会对问题进行排序。
https://stackoverflow.com/questions/37162331
复制相似问题