在花费了将近一个星期的时间来尝试为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
}
);
gCtrl模块,用于调用Google API
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;
});
};
最佳答案
您缺少对如何从异步操作返回值的理解。 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,并使其成为一个异步函数,该异步函数在有数据时使用回调或Promise进行通信,然后对Express处理程序进行编码以调用该函数并适当地使用该异步返回值。在上面的代码中,我选择使用已经构建的中间件体系结构来处理异步响应。关于node.js - Express Manipulating req对象传递给下一个中间件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40601485/