http动词的Mongoose / Express授权

我有一个node.js REST服务在mongoose上运行并且运行。 我也使用merse来build立我的路由。

我现在想要实现的是以下types的场景:

Scenario I: eg blogpost - GET -> no authentication required - POST/PUT/DELETE -> authentication required Scenario II: eg user - GET -> authentication required - POST/PUT/DELETE -> authentication required plus username of logged in user has to match 

我已经看过everyauth和mongoose-auth了,但找不到任何能给我这种控制的东西。

忘记everyauth。 这个图书馆是一个矫枉过正的问题。 实现身份validation实际上非常简单,遵循以下架构:

  1. 用户将usernamepassword传递给服务器;
  2. 服务器获取usernamepassword并检查数据库中是否有用户使用该password 。 如果没有用户,只是回应一个错误;
  3. 我们有一个用户,现在使用Express的内置会话机制。 调用req.session.regenerate并在callbackreq.session.userID = user.id执行req.session.userID = user.id Express会自动将cookie发送给用户;
  4. 创build一个中间件(必须任何其他请求处理程序之前触发),它基本上在数据库中searchreq.session.userID 。 如果它find一个,然后将其存储在req ,即req.user = user ;
  5. 在视图中,只需检查是否设置了req.uservariables。 如果是的话,那么我们是authentication的。 你完成了!

ad 1 + 2)为了使authentication安全,您应该使用一些密码(和/或HTTPS)。 例如,密码应该分为两部分: salthashsalt是随机生成的(在注册时), hash = hash_it(pwd, salt) ,其中hash_it是一些哈希algorithm(例如:MD5或SHA256)。

现在,客户端身份validation可以在几个步骤中完成(只有您可以使用JavaScript):

  1. 服务器发送随机new_salt到login页面(或者在JavaScript中生成一个,不需要隐藏生成algorithm);
  2. 用户发送AJAX请求give me salt for user X ,服务器用存储在DB中的salt响应( salt是公开的);
  3. salt对hash hash pwd进行响应,然后用new_salt再次对结果进行散列,将其存储在variableshpwd ;
  4. 客户端发送usernamehpwdnew_salt到服务器;
  5. 服务器从数据库获取username pwd使用new_salt pwd ,并将结果与new_salt进行比较(注意:不存储new_salt )。

这种方法很好,因为每次从networking上随机(从外部的angular度)login数据,即使用usernamepassword是相同的。

这很重要,因为password泄漏是一件严重的事情。 不是因为有人可以破坏你的应用程序的帐户(这是一个小的损害,除非你是一家银行 – 但是你不会问这样的问题:D)。 主要是因为人们倾向于为包括银行账户在内的多个站点使用相同的密码。