1

我难住了。我正在尝试手动获取刷新令牌以使用 Perl 在 Mirror API 上为我加载访问令牌,并且它不断给我凭据错误。当我在 PHP 示例代码中加载确切的 HTTP 请求(我已经打印出 HTTP 进行比较)时,相同的 refresh_token 工作正常。

这是我的 Perl HTTP 请求:

*POST https://accounts.google.com/o/oauth2/token 主机:accounts.google.com 用户代理:libwww-perl/6.02 内容长度:175 内容类型:application/x-www-form- urlencoded client_id=client_id_goes_here&client_secret=client_secret_goes_here&refresh_token=refresh_token_goes_here&grant_type=refresh_token*

这是同一个 refresh_token 上的 PHP:

*POST /o/oauth2/token HTTP/1.1 内容类型:application/x-www-form-urlencoded 内容长度:175 client_id=client_id_goes_here&client_secret=client_secret_goes_here&refresh_token=refresh_token_goes_here&grant_type=refresh_token*

我的 Perl 看起来像这样:

my $auth_response = $ua->request(POST 'https://accounts.google.com/o/oauth2/token',
            'Host'          => 'accounts.google.com',
            'Content_Type'  => 'application/x-www-form-urlencoded',
            'Content'       => [
                'client_id'         =>  $client_id,
                'client_secret'     =>  $client_secret,
                'refresh_token'     =>  $credentials->{'refresh_token'},
                'grant_type'        =>  'refresh_token',
            ],
        );

帮助!:-)

4

1 回答 1

1

看起来您正在使用 LWP。我破解了这个使用 LWP 从开始到令牌刷新与 Google 共舞 OAuth 2.0 的快速示例。

根据我的实验,您到目前为止显示的代码看起来是正确的。这是我用来刷新访问令牌的确切代码:

my $auth_response = $ua->request(POST 'https://accounts.google.com/o/oauth2/token',
            'Host'          => 'accounts.google.com',
            'Content_Type'  => 'application/x-www-form-urlencoded',
            'Content'       => [
                'client_id'         =>  $client_id,
                'client_secret'     =>  $client_secret,
                'refresh_token'     =>  $refresh_token,
                'grant_type'        =>  'refresh_token',
            ],
        );

如果您仍然观察到错误,请尝试克隆该存储库,填充您的 client_id 和 client_secret,并查看问题是否仍然存在。如果是这样,请分享结果,print Dumper($auth_response);这将提供很多有用的信息。

此外,Perl 不是 Google 官方支持的语言,但看起来社区已经通过:有一个开源Perl 客户端库。我以前从未使用过它,但您可能想检查一下。

于 2013-06-05T01:52:55.083 回答