【问题标题】:Mongoose/Express authorisation on http verbshttp 动词上的 Mongoose/Express 授权
【发布时间】:2012-06-26 14:10:52
【问题描述】:

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

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

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,但找不到任何可以让我进行这种控制的东西。

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    忘记一切。这个图书馆是一个矫枉过正,恕我直言。实现认证其实很简单,按照模式来:

    1. 用户将usernamepassword传递给服务器;
    2. 服务器获取usernamepassword 并在DB 中检查是否存在具有password 的用户。如果没有用户,则返回错误;
    3. 我们有一个用户,现在使用 Express 的内置会话机制。致电req.session.regenerate 并在回调中执行req.session.userID = user.id。 Express 会自动将 cookie 发送给用户;
    4. 创建一个中间件(必须在任何其他请求处理程序之前触发),它基本上在数据库中搜索req.session.userID。如果找到,则将其存储在req,即req.user = user
    5. 在视图中,您只需检查是否设置了req.user 变量。如果是,那么我们就通过了身份验证。大功告成!

    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,服务器以存储在 DB 中的 salt 进行响应(salt 是公开的);
    3. 在响应散列pwdsalt 然后再次使用new_salt 散列结果,将其存储在变量hpwd 中;
    4. 客户端向服务器发送usernamehpwdnew_salt
    5. 服务器从数据库中获取pwd username,将pwdnew_salt 进行哈希运算,并将结果与​​hpwd 进行比较(注意:您不存储new_salt)。

    这种方法很好,因为每次登录时都会随机(从外部角度)数据流经网络,即使usernamepassword 相同。

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

    【讨论】:

    • 感谢您的广泛回答。我理解它的方式(并保持我的代码精简)是创建您在 4. 中提到的中间件并在那里处理路由过滤。因此,如果 url 和动词匹配某个模式,我可以允许或拒绝..
    • @AyKarsi 是的,这是一种可能性,您可以这样做。或者您可以在最终路线中处理此问题(请记住存储req.user)。由你决定。 :)
    • 同意everyauth 是多余的。这就是我开发Passport 的原因,它是一个中间件解决方案,几乎完全按照您在步骤 1-5 中描述的内容,以及处理常见用例的选项。策略允许您使用其他功能对其进行扩展,例如使用 Facebook、Twitter 等进行第三方登录。
    • Passport 是否进行加密?还是需要独立完成?
    • 不确定是否有人会看到这个问题,但为什么我们要再次用 new_salt 散列结果(客户端上的第 3 步)?
    猜你喜欢
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 2017-03-10
    • 2019-05-05
    • 2019-07-04
    • 1970-01-01
    • 2020-08-19
    相关资源
    最近更新 更多