我有一个在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,但找不到能给我这种控制权的东西。
答案 0 :(得分:14)
忘记每一个人。这个图书馆是一个矫枉过正的imho。实际上,实现身份验证非常简单,请遵循以下模式:
username
和password
传递给服务器; username
和password
并检查数据库中是否有用户password
。如果没有用户,只需回复错误; req.session.regenerate
并在回调中执行req.session.userID = user.id
。 Express会自动将cookie发送给用户; req.session.userID
。如果找到,则将其存储在req
中,即req.user = user
; req.user
变量。如果是,那么我们通过身份验证。而且你已经完成了! ad 1 + 2)为了使身份验证安全,您应该使用一些加密(和/或HTTPS)。例如,密码应分为两部分:salt
和hash
。 salt
是随机生成的(在注册时)和hash = hash_it(pwd, salt)
,其中hash_it
是一些哈希算法(例如:MD5或SHA256)。
现在可以通过几个步骤进行客户端身份验证(仅当您可以使用JavaScript时):
new_salt
发送到登录页面(或在JavaScript中生成一个,不需要隐藏生成算法); give me salt for user X
,服务器响应存储在数据库中的salt
(salt
是公开的); pwd
的响应哈希salt
上,然后使用new_salt
再次哈希结果,将其存储在变量hpwd
; username
,hpwd
和new_salt
发送到服务器; pwd
的数据库获取username
,使用pwd
获取new_salt
,并将结果与hpwd
进行比较(注意:您不存储{{} 1}})。这种方法很不错,因为即使new_salt
和username
相同,每次从外部角度登录时(从外部角度来看)数据也会流入网络。
这很重要,因为password
泄漏是一件严肃的事情。不是因为有人可以破坏你的应用程序的帐户(这是一个轻微的损害,除非你是一家银行 - 但是你不会问这样的问题:D)。主要是因为人们倾向于为多个站点使用相同的密码,包括银行账户。