【问题标题】:What's the best way to check for a valid session in a MEAN application using express-sessions?使用快速会话在 MEAN 应用程序中检查有效会话的最佳方法是什么?
【发布时间】:2017-03-07 07:20:13
【问题描述】:

我一直在 MEAN 项目中使用 express-sessions (https://www.npmjs.com/package/express-sessions) 和 angular-route 来管理用户登录/身份验证。一旦用户登录或注册,他们的用户数据(例如整个User)就会被分配给一个会话,然后用户会被重定向到一个新页面:#!/dashboard

为了防止用户在没有先注册或登录的情况下访问#!/dashboard,我从我的角度控制器进行了快速的“会话检查”,我称之为“会话检查”,该控制器传递给角度工厂,快速ping服务器-side 检查会话对象。

如果会话存在,我返回一个布尔值true,如果会话不存在,我发送一个布尔值false。然后我做一个条件语句:如果为真,继续抓取#!/dashboard 页面上的帖子或用户数据等(用户会话有效)。如果为false,则重定向到登录页面所在的/(阻止用户访问#!/dashboard)。

这实现了我的目标,即阻止用户现在在没有登录/注册的情况下在浏览器中输入/#!/dashboard,但这似乎是一个昂贵的解决方案,而且不是很干净。

是否有更简洁或更好的方法来执行此“会话检查”以防止在没有有效登录会话的情况下访问我的后端页面?

我使用过 express 中间件,也许有办法对每个请求进行快速检查?

有人对我如何改进会话检查有任何建议吗?

【问题讨论】:

  • 如果我没有错,您正在从客户端(角度)进行会话检查。如果没有很好地实施,那将是一场巨大的安全灾难。
  • 你的应用是完全单页的应用
  • @Iceman 也许这是一个很大的安全问题——我还在学习——更多信息:我检查会话的方式是创建一个服务器路由,去后端,签入req 对象,如果存在会话,如果存在,则返回 true,如果不存在,则返回 false(作为变量,validSession)。然后,一旦收到来自后端的响应,我在我的角度工厂中运行的回调函数中有一个简单的行:if (!validSession) { $location.url('/'); }; 因此,如果会话无效,它会重定向到/ 页面。您的方法看起来好多了,但是这种方式被描述为不安全吗?
  • @BOSS 是的,它是使用 angular-routes 的单个寻呼机——有单独的页面,但它们是以角度加载的部分。
  • 是的,一个布尔值的客户端检查是黑客可以利用的安全漏洞来访问他不应该看到的页面。解决方法是意识到这一切都很好:UI 是一种客户端数据,它实际上是公开的。但是,与此 UI 相结合的内部数据应该受到保护。因此,它必须在 UI 渲染时获取,并根据用户会话的有效性提供给客户端代码。然后一切都归结为:我可以信任我的客户的 req/res 机制吗?它是可篡改的吗? => 安装安全软件。有中间人吗? => https

标签: javascript angularjs node.js session mean-stack


【解决方案1】:
function secure_pass(req, res, next) {
    if (req.session.loggedIn || req.path==='/login') {
        next();
    } else {
       res.redirect("/login");
    }
}

这个函数负责如果session.loggedIn 没有设置为true,那么用户会被重定向到/login

现在将其作为中间件注入:

app.use(secure_pass);

现在,以上行之后的任何app.get("/", myfunc); 现在都将通过您的secure_pass 函数“保护”。

当然,您也可以选择性地只为某些路由注入中间件,而不是全部:

app.get("/", secure_pass, myfunc);

注意:以上是未经测试的代码。我只是快速地把它放在一起,给你一个方法的想法。

【讨论】:

  • 今天晚些时候我将在这里查看并玩转。我真的很欣赏这个例子。弄脏手后我会回复你的。
  • +1 为了您的帮助和选择性注入,非常方便。我能够创建一个函数并按照说明注入它,但是,当我运行 res.redirect('/'); 如果我的会话不存在时,我实际上在客户端控制台中收到了整个 html 文件,而不是体验页面重定向。我相信这是因为我正在使用 angular-route 并且部分系统正在干扰。 (这就是为什么我选择使用$location 来处理我的页面重定向,而不是res.redirect)。您是否知道在设置angular-routes(部分)时是否仍然可以res.redirect
  • 使用自定义中间件是正确的答案——对于会话或 JWT。仍在努力让这一切正常工作,但中间件解决方案,并将其注入特定路由,对于检查 JWT 或会话信息非常有帮助......谢谢!
【解决方案2】:

如果您在前端使用 AngularJS 2,则有 guards 的概念来保​​护您的路由免受未经授权的访问,但这仅处理您应用程序的角度部分;您还需要通过护照等模块保护您的 Express 应用程序。您也可以考虑使用令牌身份验证而不是使用passportjwt 的会话。我写了 2 篇关于如何从 backfront 端使用护照和 jwt 验证你的平均应用程序的文章。

【讨论】:

  • 为了解决所有这些问题,我昨晚做了一些阅读,确实表明 JSON Web Tokens 更适合单页应用程序。我将阅读您的文章,玩转,以及在此线程中发布的其他解决方案,然后回复您。谢谢!
  • 你用过jsonwebtoken (jwt.io)吗?看来我可以单独使用 JWT(没有 Passport),不是吗? (我希望练习 Passport,但只是想为这个特定项目找到一个更简单的解决方案)。我已为您的文章添加了书签,以便稍后在深入研究 Passport 时返回此处。 +1 谢谢你的资源,看起来很详细,有很好的例子。
  • 在这种情况下,Passport 仅对您的用户进行身份验证,例如用户名和密码;如果您愿意,您可以通过其他方式实现这一点。 express-jwt-token 是一个用于在你的 express 应用中使用 jwt.io 的模块,否则你需要在你的 express 应用中自己实现库 jwt.io。
猜你喜欢
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
相关资源
最近更新 更多