忘记了Everyauth。这个图书馆太夸张了,恕我直言。实际上,实现身份验证非常简单,请遵循以下架构:
- 用户通过
username
并password
到达服务器; - 服务器获取
username
并password
在DB中检查是否有该用户password
。如果没有用户,则返回错误; - 我们有一个用户,现在使用Express的内置会话机制。调用
req.session.regenerate
和在回调中执行req.session.userID = user.id
。Express会自动将cookie发送给用户; - 创建一个中间件(必须 在 其他任何请求处理程序 之前启动 ),该中间件基本上在数据库中搜索
req.session.userID
。如果找到一个,则将其存储在中req
;即req.user = user
; - 在视图中,您只需检查是否
req.user
设置了变量。如果是,则我们已通过身份验证。大功告成!
广告1 +
2)为了确保身份验证的安全性,您应该使用一些加密技术(和/或HTTPS)。例如,密码应分为两部分保存在数据库中:
salt和
hash。
salt是随机生成的(在注册时)和
hash= hash_it(pwd, salt),其中
hash_it是一些哈希算法(例如:MD5或SHA256)。
现在可以通过几个步骤进行客户端身份验证(仅当您可以使用Javascript时):
- 服务器将随机发送
new_salt
到登录页面(或在Javascript中生成一个,无需隐藏生成算法); - 用户发送AJAX请求
give me salt for user X
,服务器以salt
存储在DB中的响应(salt
公共); - 对响应进行哈希
pwd
处理salt
,然后再对结果进行哈希处理new_salt
,将其存储在变量中hpwd
; - 客户端发送
username
,hpwd
并new_salt
给服务器; - 服务器
pwd
从DB 获取forusername
,pwd
使用new_salt
进行哈希处理并将结果与进行比较hpwd
(注意:您不存储new_salt
)。
这种方法非常好,因为每次登录(从外部角度来看)都是随机的数据流经net(即使
usernameand
password相同)。
这很重要,因为
password泄漏很严重。并不是因为有人可以破坏您应用程序的帐户(除非您是银行,否则这是很小的损失-
但是您不会问这样的问题:D)。主要是因为人们倾向于对多个站点(包括银行帐户)使用相同的密码。



