http动词的Mongoose / Express授权

时间:2012-06-25 10:13:39

标签: node.js express

我有一个在mongoose和express上运行的node.js REST服务。我也使用merse来设置我的路由。

我现在想要实现的是以下类型的sceanrios:

Scenario I: e.g. blogpost
- GET -> no authentication required
- POST/PUT/DELETE -> authentication required

Scenario II: e.g. user
- GET -> authentication required
- POST/PUT/DELETE -> authentication required plus username of logged in user has to match

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

1 个答案:

答案 0 :(得分:14)

忘记每一个人。这个图书馆是一个矫枉过正的imho。实际上,实现身份验证非常简单,请遵循以下模式:

  1. 用户将usernamepassword传递给服务器;
  2. 服务器获取usernamepassword并检查数据库中是否有用户password。如果没有用户,只需回复错误;
  3. 我们有一个用户,现在使用Express的内置会话机制。致电req.session.regenerate并在回调中执行req.session.userID = user.id。 Express会自动将cookie发送给用户;
  4. 创建一个中间件(必须在任何其他请求处理程序之前触发),它基本上在数据库中搜索req.session.userID。如果找到,则将其存储在req中,即req.user = user;
  5. 在视图中,您只需检查是否设置了req.user变量。如果是,那么我们通过身份验证。而且你已经完成了!
  6. ad 1 + 2)为了使身份验证安全,您应该使用一些加密(和/或HTTPS)。例如,密码应分为两部分:salthashsalt是随机生成的(在注册时)和hash = hash_it(pwd, salt),其中hash_it是一些哈希算法(例如:MD5或SHA256)。

    现在可以通过几个步骤进行客户端身份验证(仅当您可以使用JavaScript时):

    1. 服务器将随机new_salt发送到登录页面(或在JavaScript中生成一个,不需要隐藏生成算法);
    2. 用户发送AJAX请求give me salt for user X,服务器响应存储在数据库中的saltsalt是公开的);
    3. 在使用pwd的响应哈希salt上,然后使用new_salt再次哈希结果,将其存储在变量hpwd;
    4. 客户端将usernamehpwdnew_salt发送到服务器;
    5. 服务器从pwd的数据库获取username,使用pwd获取new_salt,并将结果与​​hpwd进行比较(注意:您不存储{{} 1}})。
    6. 这种方法很不错,因为即使new_saltusername相同,每次从外部角度登录时(从外部角度来看)数据也会流入网络。

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