0

我现在正在尝试使用 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 开发人员工具进行了检查,这表明请求 URLhttps://accounts.google.com/o/oauth2/approval?as=-5013c18c497345fc&hl=en&pageId=none&xsrfsign=APsBz4gAAAAAUcwS1TxlojrAPVNCj7ntTlz1H4xQgysC不是我发布的内容。

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

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

4

1 回答 1

0

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

首先,当您构造消息的表单数据部分时,请确保您对所有值进行 URL 编码,例如,如果 redirect_uri 值包含 &,除非它是 URL 编码,否则将导致您出现问题。

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

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

于 2013-06-27T16:47:17.077 回答