来自Node.js的Javascript中来自getToken的invalid_request

时间:2014-01-13 20:10:00

标签: 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   = 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的方式。首先,我将网址设置为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的原始调用。

1 个答案:

答案 0 :(得分:2)

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

相关问题