忘记一切。这个图书馆是一个矫枉过正,恕我直言。实现身份验证实际上非常简单,遵循架构:
- 用户通过
username
并password
到服务器;
- 服务器获取
username
并password
检查数据库中是否有用户password
。如果没有用户,则返回错误;
- 我们有一个用户,现在使用 Express 的内置会话机制。调用
req.session.regenerate
并在回调中做req.session.userID = user.id
. Express 会自动将 cookie 发送给用户;
- 创建一个中间件(必须在任何其他请求处理程序之前触发),它基本上在数据库中搜索
req.session.userID
. 如果找到,则将其存储在 中req
,即req.user = user
;
- 在视图中,您只需检查是否
req.user
设置了变量。如果是,那么我们就通过了身份验证。你完成了!
ad 1+2) 为了确保身份验证安全,您应该使用一些密码学(和/或 HTTPS)。例如,密码应分两部分保存在 DB 中: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 中获取,与结果进行username
散列并将结果与(注意:您不存储)进行比较。pwd
new_salt
hpwd
new_salt
这种方法很好,因为每次登录时都会随机(从外部角度)数据流过网络,即使 theusername
和 thepassword
是相同的。
这很重要,因为password
泄漏是一件很严重的事情。不是因为有人可以破坏您的应用程序的帐户(这是轻微的损害,除非您是银行 - 但是您不会问这样的问题 :D )。主要是因为人们倾向于对多个网站使用相同的密码,包括银行账户。