如果可能,如何通过后端 REST 对瘦服务器 SPA 用户进行身份验证,其中 nginx 角色仅限于提供静态内容和代理后端 REST?
If possible, How to authenticate thin server SPA users through backend REST where nginx role limited to serve static content and proxy Backend REST?
我正在使用瘦服务器架构构建 SPA(在我的例子中,这意味着:网络服务器角色仅限于服务器静态内容并使用后端 REST 服务路由 xhr):
到目前为止,我未能找到任何提供满足我要求的用户身份验证方案的示例,当涉及到用户身份验证时,我所看到的所有网络服务器(服务器端代码)都涉及其 php/nodejs/asp.net。 .等
我想构建对属于网络服务器的服务器端代码零依赖的身份验证:
详情:
- 用户请求 login.html。
- NGINX 满足了用户请求。
- 用户提供凭据并提交。
- Ajax XHR 由 NGINX 接收并路由到身份验证后端 REST 服务。
- 身份验证后端服务验证请求并返回包含会话 cookie/access token/api 密钥的响应。
- Ajax XHR通过NGINX收到响应,然后呢?我该如何进行?以下是我目前的想法:
一个。在许多示例中(包括 instagram):window.location.reload();。但在我的例子中,reload login.html 不会导致 NGINX 将用户转发到登录页面,除非它维护身份验证逻辑!那我怎么才能越过这个障碍呢?
b.如果我将用户重定向到 landing.html,NGINX 将为它提供服务。但这同样是不可接受的,因为必须首先验证每个资源请求(login.html 除外)(我的意思是身份验证和授权)。
我希望问题现在已经清楚了。我认为如果 NGINX 可以配置为在每个请求到达原始目的地之前将每个请求传递给身份验证后端 REST 服务,那么大部分将得到解决,尽管这对于身份验证服务来说可能是一个很大的开销!
这里最好的选择是使用 X-Accel-Redirect。这将允许您将请求传递给身份验证服务,然后在身份验证服务中您可以 运行 您的身份验证逻辑,如果成功设置 X-Accel-Redirect header 以便当 nginx 获得响应时它将对您实际要调用的资源执行内部重定向。如果身份验证失败,您的服务可以回复 401 而不是设置 header 这样 nginx 将向客户端提供正确的响应。
您的另一个选择是将其实现为自定义 Lua 模块。
我正在使用瘦服务器架构构建 SPA(在我的例子中,这意味着:网络服务器角色仅限于服务器静态内容并使用后端 REST 服务路由 xhr):
到目前为止,我未能找到任何提供满足我要求的用户身份验证方案的示例,当涉及到用户身份验证时,我所看到的所有网络服务器(服务器端代码)都涉及其 php/nodejs/asp.net。 .等
我想构建对属于网络服务器的服务器端代码零依赖的身份验证:
详情:
- 用户请求 login.html。
- NGINX 满足了用户请求。
- 用户提供凭据并提交。
- Ajax XHR 由 NGINX 接收并路由到身份验证后端 REST 服务。
- 身份验证后端服务验证请求并返回包含会话 cookie/access token/api 密钥的响应。
- Ajax XHR通过NGINX收到响应,然后呢?我该如何进行?以下是我目前的想法:
一个。在许多示例中(包括 instagram):window.location.reload();。但在我的例子中,reload login.html 不会导致 NGINX 将用户转发到登录页面,除非它维护身份验证逻辑!那我怎么才能越过这个障碍呢?
b.如果我将用户重定向到 landing.html,NGINX 将为它提供服务。但这同样是不可接受的,因为必须首先验证每个资源请求(login.html 除外)(我的意思是身份验证和授权)。
我希望问题现在已经清楚了。我认为如果 NGINX 可以配置为在每个请求到达原始目的地之前将每个请求传递给身份验证后端 REST 服务,那么大部分将得到解决,尽管这对于身份验证服务来说可能是一个很大的开销!
这里最好的选择是使用 X-Accel-Redirect。这将允许您将请求传递给身份验证服务,然后在身份验证服务中您可以 运行 您的身份验证逻辑,如果成功设置 X-Accel-Redirect header 以便当 nginx 获得响应时它将对您实际要调用的资源执行内部重定向。如果身份验证失败,您的服务可以回复 401 而不是设置 header 这样 nginx 将向客户端提供正确的响应。
您的另一个选择是将其实现为自定义 Lua 模块。