我正在添加通过一个简单的应用程序将待办事项发布到我的Todist列表的功能。目前,我在为access_token交换代码时收到了回复use strict;
use warnings 'all';
use YAML::XS 'LoadFile';
use MyUtils 'parse_yaml';
my $input_file = 'data.yaml';
my $yaml_input = LoadFile($input_file);
parse_yaml($input_file);
# this variable has to be passed to the function parse_yaml which is in other file.
。
在这种情况下,我不确定'invalid_grant'究竟是指什么。我发现其他答案似乎与各种Google API有关。 Todoist API documentation没有提到它。
令牌交换的发布请求是:
package MyUtils;
use strict;
use warnings;
use Exporter 'import';
our @EXPORT_OK = 'parse_yaml';
sub parse_yaml {
my ($yaml_file) = @_;
# some processing
}
1;
非常感谢任何帮助理解和解决这个问题。
更新
在阅读Takahiko Kawasaki的回答后,我已将请求更新为以下内容,但有相同的错误消息。
"error"=>"invalid_grant"
答案 0 :(得分:1)
添加以下内容。
grant_type: 'authorization_code'
有关详细信息,请参阅RFC 6749,4.1.3. Access Token Request。
<小时/> 对修订后的问题的补充评论。
似乎Todoist的OAuth实施还不成熟。我查看了他们的API document,很快发现了一些针对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。
答案 1 :(得分:0)
最新版本的Todoist API(v8)不需要grant_type
参数,因此当前不是问题。
出现invalid_grant
错误的两个可能原因是:
code
在一段时间内未使用,并且已过期code
已用于生成访问令牌,因此不再有效在两种情况下,在发出POST请求之前生成一个新的code
应该可以解决问题。