在花了将近一周的时间尝试为Google令牌实施护照策略失败之后,我决定使用针对Google API的Nodejs客户端库自行编写。我在$ http请求中传递来自angularjs的accesstoken,并希望在服务器端进行身份验证后将登录用户返回到调用。 我将登录用户传递给req对象时遇到了麻烦,因此我可以将其传递给下一个中间件。任何帮助将不胜感激。
**express code**
路由器
var gCtrl = require('./googleController.js');
app.post('/auth/google/accesstoken',
function (req, res) {
console.log('Im in the google auth middleware');
//below line is not returning the gUser so I can pass it to the next middleware
var gUser=gCtrl(req.token);
res.send(gUser);
},
function(req,res){
//do something with authenticated user
}
);
进行Google API调用的gCtrl模块
var ubCust = require('../models/ubCust.js');
var bodyParser = require('body-parser');
var google=require('googleapis');
var plus = google.plus('v1');
var OAuth2 = google.auth.OAuth2;
var oauth2client = new OAuth2('1094664898379-8u0muh9eme8nnvp95dafuc3rvigu4j9u.apps.googleusercontent.com','KQ_vNDaZzTvXDdsfgp5jqeZW','http://localhost:3000/auth/google/callback');
module.exports = function(acc_token){
//console.log(acc_token);
oauth2client.setCredentials({
access_token : acc_token
//refresh_token: token.refresh_token
});
plus.people.get({
userId:'me',
auth:oauth2client
},function(err,response){
if (err)
throw err;
//console.log('google user',response);
return response;
});
};
答案 0 :(得分:3)
您无法理解如何从异步操作返回值。你的gCtrl模块中有return response
的地方只是将值内部返回到plus.people.get()
内的异步操作。这不会从module.exports
函数返回值。这个功能早已回归。
您可以在这里阅读有关从异步操作返回值的一般概念:How do I return the response from an asynchronous call?。您将需要使用回调函数或promise来回传异步值。你不能直接退货。
现在,在您的特定情况下,您可以使用gCtrl
模块作为Express中间件,将中间令牌值设置为中间件处理程序中的req
对象,然后使用next()
传达它现在是时候为请求调用主处理程序。你可以这样做:
// gtrl - Express middleware handler
// the purpose of this middleware is to process req.token
// and set req.tokenResponse for further processing
// in the next step of the middleware/request handler processing
module.exports = function(req, res, next) {
oauth2client.setCredentials({
access_token : req.token
//refresh_token: token.refresh_token
});
plus.people.get({
userId:'me',
auth:oauth2client
}, function(err,response){
if (err) {
// communicate back error in some fashion, may want to return a 5xx response for an internal error
next(err);
} else {
// set value into req object for later consumption
req.tokenResponse = response;
// call next handler in the chain
next();
}
});
};
// router
var gCtrl = require('./googleController.js');
// use gCtrl middleware to do async processing on req.token
app.post('/auth/google/accesstoken', gCtrl, function(req, res) {
// req.tokenResponse is set here by the gCtrl middleware
// do something with authenticated user
// send some sort of response here
res.send(...);
});
注意:为了使这项工作,我们必须专门使gCtrl
导出的函数与快速中间件的函数签名匹配,并直接从req
对象检索令牌。您可以使gCtrl
模块独立于Express,并使其成为异步函数,使用回调函数或承诺在它拥有数据时进行通信,然后对快速处理程序进行编码以调用该函数,适当地使用该异步返回值。在我上面的代码中,我选择使用已经构建的中间件架构来处理异步响应。