在成功进行NodeJS身份验证后使用Nginx提供静态内容

Context:

我正在尝试构建一个Web应用程序,其中Nginx充当前端服务器,也作为后端的NodeJS服务器的代理 . 我想通过适当的身份验证机制来限制对webapp功能部分的访问 . 身份验证逻辑由NodeJS服务器处理,并使用JWT来处理相同的事件 .

Current flow:

  • 静态登录页面显示给Nginx提供服务的用户 .

  • 用户凭证被发送到Nginx服务器,该服务器被转发到处理登录逻辑的NodeJS服务器,并且成功认证后发送回JWT令牌 . (所有www.baseurl.com/api请求都被转发到NodeJS服务器)

  • JWT存储在客户端浏览器的localStorage中(由Auth0团队推荐),然后我想将用户重定向到功能性webapp页面(比如/ home) .

  • 对于重定向,我正在使用我的JWT令牌请求访问/ api / home页面到Nginx服务器 . 此请求将转发给NodeJS以验证令牌 . 一旦验证,我需要提供webapp功能主页,它是.html,.css,.js文件的混合 .

  • 由于页面本身首先呈现静态,然后它使ajax请求加载更多内容,我想从我的Nginx服务器提供这个主页,而不是从Node JS服务器发送整个HTML字符串 . 并且一旦在客户端机器上加载静态页面,我想开始向节点服务器发出请求,以请求进一步的页面内容,具体取决于用户的权限 .

Problem statement:

如何使用Node和Nginx实现相同的目标? Nginx如何知道NodeJS在步骤4中验证了用户令牌,然后为主页的静态部分提供服务?

这有可能吗?处理此类身份验证流程的最佳推荐方法是什么?

PS: 我在服务器端使用ExpressJS框架,而在客户端使用普通的html / css / js(没有客户端Web框架) .

回答(2)

2 years ago

我想出了涉及以下步骤的解决方案:

  • 使用Nginx提供静态登录页面

  • 将登录凭据转发到处理身份验证的NodeJS服务器,并将auth-token存储在响应cookie中(仅限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 years ago

我认为你有两个解决这个问题的方法 .

1.在NGINX级别验证令牌

你正在使用Auth0吗?他们 Build 了一个库,用Nginx和Lua来验证JWT令牌 . 所以按照their tutorial你应该是好的 .

2.不验证令牌

我相信单页应用程序的敏感部分存在于其数据和后端算法中 . 前面的HTML,CSS和JS文件(在大多数情况下)可能无法保护它们 . 人们可以创建一个帐户,获取所有安全文件并在公共网站上公开 . 保持愚蠢简单 . 如果它's not useful to secure those files, don' t做到了!

我希望这能帮到您 :)