【问题标题】:invalid_request from getToken in Javascript from Node.js来自 Node.js 的 Javascript 中 getToken 的 invalid_request
【发布时间】:2014-07-23 12:01:31
【问题描述】:

我在 node.js 服务器应用程序中有以下代码

app.get('/AuthorizeGoogle.html',function(req,res) {
    var auth        = new googleapis.OAuth2Client(config.google_login.client_id, config.google_login.client_secret, config.google_login.redirect_uri);
    var queryData   = url.parse(req.url,true).query;
    var code        = encodeURIComponent(queryData.code);

    console.log('Authorization Request recieved ');;

    console.log('Retrieiving token');
    auth.getToken(code,function(err,tokens) {
        console.log('Retrievied token ');
        console.log(tokens);
        console.log('**** ERROR ****');
        console.log(err);

        console.log('Calling setCredentials');
        auth.setCredentials(tokens);
        console.log('*****FINISHED!!!!!');
    });

    res.send('Authorization recieved ' + queryData.code)
});

当 Google 返回并且用户已授权访问其 Google 帐户时调用此方法。

我得到一个代码。但是,当 auth.getToken() 我收到 invalid_request 时。我已经在 C# 中成功完成了这项工作,但我现在正在转向更多开源工具,因此将项目转移到 Node.js

提前致谢

好的 - 我再次查看了建议的页面,并对我的代码进行了一些重构,并且成功了。我认为问题可能出在最初用于获取令牌的 Url。

我已经在初始化 oauth2Client

var OAuth2Client = googleapis.OAuth2Client;
var oauth2Client;
oauth2Client    = new OAuth2Client(config.google_login.client_id, config.google_login.client_secret, config.google_login.redirect_uri);

所需的客户端 ID、密码和重定向 URL 已在配置文件中定义

首先我改变了生成该网址的方式。首先,我将 URL 设置为 Login to Google 到 GoogleLogin.html,当服务器收到对该页面的请求时,它将执行以下操作。

app.get('/GoogleLogin.html',function(req,res) {
    var scopes = "";

    // retrieve google scopes
    scopes += config.google_login.scopes.baseFeeds + " "
    scopes += config.google_login.scopes.calendar + " "
    scopes += config.google_login.scopes.drive + " "
    scopes += config.google_login.scopes.driveMetadata + " "
    scopes += config.google_login.scopes.profile + " "
    scopes += config.google_login.scopes.email + " "
    scopes += config.google_login.scopes.tasks

    var url = oauth2Client.generateAuthUrl({
        access_type: 'offline',
        scope: scopes
    });

    res.writeHead(302, {location: url});
    res.end();


});

这首先构建一个范围字符串,然后在重定向到生成的 url 之前生成授权 URL

当 Google 重定向回该站点时,将执行以下操作

app.get('/AuthorizeGoogle.html',function(req,res) {
    // var auth = new googleapis.OAuth2Client(config.google_login.client_id,config.google_login.client_secret, config.google_login.redirect_uri);
    var queryData   = url.parse(req.url,true).query;
    var code        = queryData.code;

    console.log('Authorization Request recieved ');;

    console.log('Retrieving token');
    oauth2Client.getToken(code,function(err,tokens) {
        console.log('Retrieved token ');
        console.log(tokens);
        console.log('**** ERROR ****');
        console.log(err);

        console.log('Calling setCredentials');
        oauth2Client.setCredentials(tokens);
        console.log('*****FINISHED!!!!!');
    });

    res.send('Authorization recieved ' + queryData.code)
});

现在可以正确返回令牌和刷新令牌。由于它是相同的代码,我唯一能做错的就是最初对 Google 的调用。

【问题讨论】:

  • 你不应该打电话给encodeURIComponent
  • 谢谢,但我添加了它以查看它是否需要它 - 如果没有它,我仍然会收到 invalid_request。

标签: javascript node.js


【解决方案1】:

我认为您最好的选择是研究以下 github 示例中所做的工作:https://github.com/google/google-api-nodejs-client/blob/master/examples/oauth2.js

【讨论】:

  • 这就是我的代码的基础。如果我理解正确,该代码使用输入来提供代码。当然,在我的例子中,代码是直接从 Google 发送到 AuthorizeGoogle 页面的 - 我缺少一些东西,但看不到什么。
猜你喜欢
  • 2016-02-25
  • 2019-08-18
  • 1970-01-01
  • 2021-12-24
  • 2019-04-15
  • 2011-07-16
  • 2015-03-06
  • 1970-01-01
相关资源
最近更新 更多