尝试使用google oauth api获取access_token,但重定向到“o / oauth2 / approval”

时间:2013-06-27 10:15:46

标签: google-oauth oauth2-playground

我现在正尝试使用google oauth api允许Google用户登录我的应用。我一直关注谷歌的OAuth2Login文档。

我用它来获取代码,它运行得很好。

var u = 'https://accounts.google.com/o/oauth2/auth?'
    + '&response_type=code'
    + '&client_id=' + opts.googleClient
    + '&redirect_uri=' + redirectURI
    + '&scope=' + opts.scope
    + '&approval_prompt=force&access_type=offline';

但是当我尝试使用/o/oauth2/token api获取access_token时,如下所示:

    var u = 'https://accounts.google.com/o/oauth2/token?'
        + 'code=' + code
        + '&client_id=' + opts.googleClient
        + '&client_secret=' + opts.googleSecret
        + '&scope='
        + '&redirect_uri=' + redirectURI
        + '&grant_type=' + 'authorization_code';
    request.post({url: u, json: true}, fn);

它让我回来了

{
    error: "invalid_request"
}

我已使用网络栏中的Chrome开发者工具检查了这一点,该工具指示请求网址为https://accounts.google.com/o/oauth2/approval?as=-5013c18c497345fc&hl=en&pageId=none&xsrfsign=APsBz4gAAAAAUcwS1TxlojrAPVNCj7ntTlz1H4xQgysC,而非我发布的内容。

我可以确保我的帖子网址和数据看起来与Google oauthplayground中的完全相同。但结果完全不同。

我做错了什么吗?请帮忙。

1 个答案:

答案 0 :(得分:0)

您发送的数据看起来是正确的,但看起来请求的形成方式有两个错误。

首先,当您构建邮件的表单数据部分时,请确保您对所有值进行URL编码,例如如果redirect_uri值包含&,除非是URL编码,否则会导致问题。

其次,当您正确执行POST而不是GET时,您仍然在查询字符串中而不是在请求正文中发送参数。将它们移动到正文,将内容类型设置为'application / x-www-form-urlencoded',然后设置。

(它看起来像JavaScript,但我不确定您使用的是哪些库,因此我没有提供示例代码)