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实际上非常简单,遵循以下架构:
- 用户将
username
和password
传递给服务器; - 服务器获取
username
和password
并检查数据库中是否有用户使用该password
。 如果没有用户,只是回应一个错误; - 我们有一个用户,现在使用Express的内置会话机制。 调用
req.session.regenerate
并在callbackreq.session.userID = user.id
执行req.session.userID = user.id
Express会自动将cookie发送给用户; - 创build一个中间件(必须在任何其他请求处理程序之前触发),它基本上在数据库中search
req.session.userID
。 如果它find一个,然后将其存储在req
,即req.user = user
; - 在视图中,只需检查是否设置了
req.user
variables。 如果是的话,那么我们是authentication的。 你完成了!
ad 1 + 2)为了使authentication安全,您应该使用一些密码(和/或HTTPS)。 例如,密码应该分为两部分: salt
和hash
。 salt
是随机生成的(在注册时), hash = hash_it(pwd, salt)
,其中hash_it
是一些哈希algorithm(例如:MD5或SHA256)。
现在,客户端身份validation可以在几个步骤中完成(只有您可以使用JavaScript):
- 服务器发送随机
new_salt
到login页面(或者在JavaScript中生成一个,不需要隐藏生成algorithm); - 用户发送AJAX请求
give me salt for user X
,服务器用存储在DB中的salt
响应(salt
是公开的); - 用
salt
对hash hashpwd
进行响应,然后用new_salt
再次对结果进行散列,将其存储在variableshpwd
; - 客户端发送
username
,hpwd
和new_salt
到服务器; - 服务器从数据库获取
username
pwd
使用new_salt
pwd
,并将结果与new_salt
进行比较(注意:不存储new_salt
)。
这种方法很好,因为每次从networking上随机(从外部的angular度)login数据,即使用username
和password
是相同的。
这很重要,因为password
泄漏是一件严重的事情。 不是因为有人可以破坏你的应用程序的帐户(这是一个小的损害,除非你是一家银行 – 但是你不会问这样的问题:D)。 主要是因为人们倾向于为包括银行账户在内的多个站点使用相同的密码。