成功 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 属性时验证令牌?

成功 IMC 身份验证后 Worklight 身份验证错误 401

如何在 React/NodeJS 身份验证流程中使用 httpOnly cookie 获取用户数据