我有这个中间件功能,检查用户是否登录,因为我有web应用程序和Android平台因此我使用Android的令牌和web我正在使用会话,默认情况下经理通过护照。
In my function
我正在检查如果我有一个Authorization标头,我知道它是我的android平台,因此通过验证jwt令牌来验证用户,但它总是发送给我401未经授权而不设置req.user。 / p>
这是中间件功能,如果有人可以在我的逻辑中错误地指出我的错误。
var jwt_auth = require('express-jwt')
// route middleware to make sure a user is logged in
function isLoggedIn(req, res, next) {
if (req.get("Authorization")) {
jwt_auth({secret: 'somesecret'});
if (req.user) {
return next();
}
res.send(200, "Unauthorized access");
}
else {
// if user is authenticated in the session, carry on
if (req.isAuthenticated())
return next();
// if they aren't redirect them to the home page
res.redirect('/');
}
}
答案 0 :(得分:2)
那是因为jwt_auth是异步操作而你的res.send(200,“未经授权的访问”)永远不会等待jwt_auth完成。
你应该看一下express-jwt的例子。
基本的是
var jwt = require('express-jwt');
app.get('/protected',
jwt({secret: 'shhhhhhared-secret'}),
function(req, res) {
if (!req.user.admin) return res.sendStatus(401);
res.sendStatus(200);
});
如果要传递自定义函数以从请求中提取令牌,请使用getToken选项,以下示例取自快递jwt的README,您可以根据需要修改该函数。
app.use(jwt({
secret: 'hello world !',
credentialsRequired: false,
getToken: function fromHeaderOrQuerystring (req) {
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
return req.headers.authorization.split(' ')[1];
} else if (req.query && req.query.token) {
return req.query.token;
}
return null;
}
}));