来自Node.js的Javascript中getToken的invalid_request

我有一个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

提前致谢

好的 – 我又看了一遍build议的页面,做了一些我的代码的重构,并且工作。 我认为可能是这个问题是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); 

已经在configuration文件中定义了所需的客户端ID,秘密和redirectURL

所以首先,我改变了我生成该url的方式。 首先,我设置Urllogin到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(); }); 

首先构build一个范围的string,然后在redirect到生成的url之前生成Authorization Url

当Googleredirect到网站时,会执行以下操作

 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。

我认为你最好的select是研究下面的github例子: https : //github.com/google/google-api-nodejs-client/blob/master/examples/oauth2.js