【发布时间】:2017-01-04 23:41:50
【问题描述】:
情况
- 我正在编写一个单页 Web 应用程序(使用 Angular)。让我们称之为SPA
- 另一个队友正在编写一些 API(使用 Node.js)。让我们调用服务器
- 我的 SPA 是使用 login/passwd 登录到服务器,然后做一些事情
我的队友决定使用 cookie 来跟踪会话。因此,在成功登录后,将在加载 SPA 的网络浏览器中设置一个仅限 http 的 cookie。
问题
如果我们将 SPA 放在服务器的 public_html 目录中,一切正常。然而,这使得 SPA 成为 API 代码的一部分。这打破了我们的构建过程,因为每个版本升级到 SPA 现在也需要升级 API。
如果我们将 SPA 托管在仅提供静态 SPA 文件的单独网络服务器中,我会遇到 CORS 问题。由于 SPA 的来源与其尝试访问的 API 不同,因此浏览器会阻止 ajax 调用。为了克服这个问题,我们必须在服务器端适当地设置Access-Control-Allow-Origin。我也明白需要设置Access-Control-Allow-Credentials:true,以指示浏览器设置/发送cookies。
可能的解决方案
我们创建一个构建过程,每次升级 SPA 时都会对服务器的 public_html 目录执行 git-pull。我试图避免这种情况,以保持客户端和服务器升级分开。
我们创建了一种 代理 类型的情况,其中服务器不存储 SPA 文件,而是从托管 SPA 文件的另一台服务器按需收集它们。在这种情况下,网络浏览器将看到来自同一来源的 SPA 文件和后续 ajax 调用。
我们对服务器进行编码以在其响应中设置
Access-Control-Allow-Origin:*。首先,这太开放了,看起来不安全。 它真的不安全,还是只是我的看法?另外,由于我们设置了Access-Control-Allow-Credentials:true,Chrome 会抱怨Cannot use wildcard in Access-Control-Allow-Origin when credentials flag is true.。为了克服这个问题,我们必须在Access-Control-Allow-Origin中输入确切的来源(可能使用正则表达式)。这可能会严重限制我们将 SPA 分发给未知域中的用户。对于服务器 API 设计者,基于 Cookie 的身份验证是推荐处理 SPA 身份验证的方法吗? OAuth2.0 and JWT based Authentication 似乎暗示基于 Cookie 的身份验证不适合 SPA。有什么优点/缺点?
请对上述选项发表评论,或建议您可能使用过的任何其他选项。提前致谢。
【问题讨论】:
标签: security cookies oauth cross-domain single-page-application