Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自Node.js的Javascript中getToken的\u请求无效_Javascript_Node.js - Fatal编程技术网

来自Node.js的Javascript中getToken的\u请求无效

来自Node.js的Javascript中getToken的\u请求无效,javascript,node.js,Javascript,Node.js,我在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 = ur

我在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()时,我得到的请求无效。我已经在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的方式。首先,我将登录Google的Url设置为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的调用。

我认为最好的办法是研究在下面的github示例中所做的事情:

您不应该调用
encodeURIComponent
。谢谢,但我添加了它,以查看它是否需要它-如果没有它,我仍然会收到无效的_请求。这可能是我基于代码的重复。如果我理解正确的话,代码使用输入来给出代码。当然,在我的例子中,代码是直接从谷歌发送到谷歌页面的——有一些东西我遗漏了,但看不到。