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

时间:2017-02-15 13:27:00

标签: javascript node.js express nginx jwt

上下文

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

当前流程:

  1. 向Nginx提供服务的用户显示静态登录页面。
  2. 用户凭证被发送到Nginx服务器,该服务器被转发到处理登录逻辑的NodeJS服务器,并且在成功认证时发送回JWT令牌。 (所有www.baseurl.com/api请求都被转发到NodeJS服务器)
  3. JWT存储在客户端浏览器的localStorage中(由Auth0团队推荐)然后我想将用户重定向到功能性的webapp页面(比如/ home)。
  4. 对于重定向,我请求使用我的JWT令牌访问Nginx服务器的/ api / home页面。此请求将转发给NodeJS以验证令牌。一旦验证,我需要提供webapp功能主页,它是.html,.css,.js文件的混合。
  5. 由于页面本身首先呈现静态,然后它使ajax请求加载更多内容,我想从我的Nginx服务器提供这个主页,而不是从Node JS服务器发送整个HTML字符串。并且一旦在客户端机器上加载静态页面,我想开始向节点服务器发出请求,请求进一步的页面内容,具体取决于用户的权限。
  6. 问题陈述:

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

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

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

2 个答案:

答案 0 :(得分:4)

我找到了涉及以下步骤的解决方案:

  1. 使用Nginx
  2. 提供静态登录页面
  3. 将登录凭据转发到处理身份验证的NodeJS服务器,并将auth-token存储在响应cookie中(仅限http)。将cookie设置为客户端
  4. 发送此响应
  5. 一旦客户端收到身份验证消息,请在成功请求时获取安全的webapp页面。此请求将随身携带auth-cookie。
    1. 再次将请求从Nginx转发到NodeJS服务器,验证令牌,将 X-Accel-Redirect 标头设置为在NodeJS服务器上查找安全文件的路径。
  6. 在使用X-Accel-Redirect时,需要特别注意Mime-Type的响应。

    • CSS需要使用text / css
    • 提供
    • 图片需要与images / jpeg一起提供
    • HTML内容应与text / html
    • 一起提供

答案 1 :(得分:0)

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

1。在NGINX级别验证令牌

你正在使用Auth0吗?他们建立了一个库来验证JWT令牌与Nginx& Lua中。所以请关注their tutorial,你应该做得很好。

2。不要验证令牌

我认为单页面应用程序的敏感部分存在于其数据和后端算法中。前面的HTML,CSS和JS文件(在大多数情况下)不需要保护!并且它可能无法保护它们。可以创建一个帐户,获取所有安全文件并在公共网站上公开。保持简单愚蠢。如果保护这些文件没用,请不要这样做!

我希望这会对你有所帮助:)。