成功 NodeJS 身份验证后使用 Nginx 提供静态内容
Posted
技术标签:
【中文标题】成功 NodeJS 身份验证后使用 Nginx 提供静态内容【英文标题】:Serving static content using Nginx after successful NodeJS authentication 【发布时间】:2017-07-04 04:36:38 【问题描述】:上下文:
我正在尝试使用 nginx 作为前端服务器并作为后端 NodeJS 服务器的代理来构建一个 webapp。我想通过适当的身份验证机制限制对 webapp 功能部分的访问。身份验证逻辑由 NodeJS 服务器处理并使用 JWT 来处理。
当前流程:
-
静态登录页面显示给由 Nginx 提供服务的用户。
用户凭据被发送到 Nginx 服务器,该服务器被转发到处理登录逻辑的 NodeJS 服务器,并在成功的身份验证后发回 JWT 令牌。 (所有 www.baseurl.com/api 请求都被转发到 NodeJS 服务器)
JWT 存储在客户端浏览器的 localStorage 中(由 Auth0 团队推荐),然后我想将用户重定向到功能性 webapp 页面(例如 /home)。
对于重定向,我请求使用我的 JWT 令牌访问 Nginx 服务器的 /api/home 页面。该请求被转发到 NodeJS 以验证令牌。验证后,我需要提供包含 .html、.css、.js 文件的 webapp 功能主页。
由于页面本身首先呈现为静态,然后它发出 ajax 请求以加载更多内容,因此我想从我的 Nginx 服务器提供此主页,而不是从 Node JS 服务器发送整个 HTML 字符串。一旦静态页面加载到客户端机器上,我想开始向节点服务器发出请求,根据用户的权限请求更多页面内容。
问题陈述:
如何使用 Node 和 Nginx 实现相同的目标? Nginx 怎么知道 NodeJS 已经在第 4 步验证了用户令牌,然后提供主页的静态部分?
这甚至可能吗?处理此类身份验证流程的最佳推荐方法是什么?
PS:我在服务器端使用 ExpressJS 框架,在客户端使用普通的 html/css/js(没有客户端 Web 框架)。
【问题讨论】:
【参考方案1】:我想出了涉及以下步骤的解决方案:
-
使用 Nginx 提供静态登录页面
将登录凭据转发到处理身份验证并将 auth-token 存储在响应 cookie 中的 NodeJS 服务器(仅限 http)。将此带有 cookie 设置的响应发送给客户端
一旦客户端收到身份验证消息,成功请求安全 webapp 页面。该请求将携带 auth-cookie 连同其自身。
-
再次将请求从 Nginx 转发到 NodeJS 服务器,验证令牌,将 X-Accel-Redirect 标头设置为在 NodeJS 服务器上查找安全文件的路径。
使用 X-Accel-Redirect 时,需要特别注意响应的 Mime-Type。
CSS 需要与 text/css 一起提供 图片需要与 images/jpeg 一起提供 HTML 内容应与 text/html 一起提供【讨论】:
我很久以前就在寻找这个该死的功能:/【参考方案2】:我认为你对这个问题有两种解决方案。
1。在 NGINX 级别验证令牌
您使用的是 Auth0 对吗?他们制作了一个库来使用 Nginx 和 Lua 验证 JWT 令牌。所以关注their tutorial,你应该会很好。
2。不验证令牌
我相信单页应用程序的敏感部分在于其数据和后端算法。前面的 HTML、CSS 和 JS 文件(在大多数情况下)不需要保护!而且可能无法保护它们。您可以创建一个帐户,获取您所有的安全文件并将它们公开在公共网站上。保持愚蠢简单。如果保护这些文件没有用,请不要这样做!
希望对你有帮助:)
【讨论】:
感谢您的建议,尽管我正在使用 Node JS 进行身份验证后寻找更好的重定向解决方案!以上是关于成功 NodeJS 身份验证后使用 Nginx 提供静态内容的主要内容,如果未能解决你的问题,请参考以下文章
Auth0 NodeJS JWT 身份验证在移动应用程序的 API 中
Nodejs和PassportJs:如果身份验证失败,则不会调用passport.authenticate后重定向中间件
无法在 nodeJS 中对用户进行身份验证:TypeError:无法使用“in”运算符在 fs 中搜索“用户名”
身份服务器如何在 API 或我们使用 Authorize 属性时验证令牌?