我正在尝试学习快速会话和身份验证处理。
例如:
app.post('/login', authCredentials, function(req, res) {
console.log("second")
});
function authCredentials(req, res, next) {
//this happens first
console.log(req.body) // => { username: etc, password: etc }
next();
}
我的问题是我的authCredentials
函数应该做多少?例如,如果凭据正确,我可以执行以下操作 res.redirect('/index')
.但是,一旦我这样做了,第二个功能有什么目的?
其他问题:
- 如何处理无效凭据?
- 如果我根据凭据只返回
true
或false
authCredentials
,这不会破坏中间件流,因为它永远不会调用next()
? - 是否可以在之后的匿名回调中访问
authCredentials
中的任何内容?基本上在function(req, res) { }
?
答案取决于您的身份验证策略,即您是否使用会话标识符、访问令牌等。
无论哪种情况,我都建议您从身份验证中分离凭据交换(也称为登录)。
function usernamePasswordExchange(req,res,next){
var username = req.body.username;
var password = req.body.password;
callToAuthService(username,password,function(err,user){
if(err){
next(err); // bad password, user doesn’t exist, etc
}else{
/*
this part depends on your application. do you use
sessions or access tokens? you need to send the user
something that they can use for authentication on
subsequent requests
*/
res.end(/* send something */);
}
});
}
function authenticate(req,res,next){
/*
read the cookie, access token, etc.
verify that it is legit and then find
the user that it’s associated with
*/
validateRequestAndGetUser(req,function(err,user){
if(err){
next(err); // session expired, tampered, revoked
}else{
req.user = user;
next();
}
});
}
app.post('/login',usernamePasswordExchange);
app.get('/protected-resource',authenticate,function(req,res,next){
/*
If we are here we know the user is authenticated and we
can know who the user is by referencing req.user
*/
});
免责声明:我在Stormpath工作,我们花了很多时间写作身份验证代码:)我刚刚写了我们最新的库,stormpath-sdk-express,它具体实施了我的建议
您希望将authCredentials
中间件添加到需要身份验证的每个端点。 app.post('/login')
通常不需要任何,因为您希望首先访问此端点以实际获取凭据。
当凭据正确/有效时,您只需调用next()
工作流将跳转到下一个中间件或实际终点。如果出现错误,请使用错误对象(例如next(new Error('could not authenticate');
)调用next()
。将错误路由添加到常规路由,错误将在那里处理:
app.use(function(err, req, res, next) {
res.render('error', err);
});
- 现在应该回答了。
- 中间件不返回值。它要么调用
next()
,要么通过调用res.send()
以不同的方式结束进程。 - 将变量从一个中间件传递到另一个中间件有不同的方法。最常见的可能是将所需的值附加到
req
参数。
authenticate
是以下示例中的非同步函数:
function authCredentials(req, res, next) {
authenticate(req.body, function(err, user) {
if (err) {
return next(err);
}
req.user = user;
next();
});
}