快递用户认证中间件,应该做多少



我正在尝试学习快速会话和身份验证处理。

例如:

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') .但是,一旦我这样做了,第二个功能有什么目的?

其他问题:

  1. 如何处理无效凭据?
  2. 如果我根据凭据只返回truefalse authCredentials,这不会破坏中间件流,因为它永远不会调用next()
  3. 是否可以在之后的匿名回调中访问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);
});
  1. 现在应该回答了。
  2. 中间件不返回值。它要么调用next(),要么通过调用 res.send() 以不同的方式结束进程。
  3. 将变量从一个中间件传递到另一个中间件有不同的方法。最常见的可能是将所需的值附加到req参数。

authenticate 是以下示例中的非同步函数:

function authCredentials(req, res, next) {
    authenticate(req.body, function(err, user) {
        if (err) {
            return next(err);
        }
        req.user = user;
        next();
    });
}

相关内容

  • 没有找到相关文章

最新更新