【问题标题】:Api authentication triggers preflight so i cannot set cookiesApi 身份验证触发预检,因此我无法设置 cookie
【发布时间】:2018-07-15 00:40:59
【问题描述】:

我尝试使用密码授权从 Angular api 登录到 laravel 应用程序。因此,我正在使用我的用户名和密码向代理脚本发出发布请求,该代理脚本还将我的客户端 ID 和客户端密码发送到 oAuth 服务器。因为我想在 cookie 中存储访问令牌和刷新令牌的加密版本,所以我在我的 post 请求中设置了 Access-Control-Allow-Credentials 标头以及常规的 cors 标头。但是当我这样做时,发布请求不再是所谓的“简单”发布请求,并且浏览器确实会自动发送预检 OPTIONS 请求。此请求的缺点是它不允许设置 Access-Control-Allow-Credentials 标头。如果你这样做,你会得到一个错误。那么,有什么办法解决呢?

我找到了一种解决方法,但我不喜欢它:我现在不发送 Access-Control-Allow-Credentials 标头,也不尝试返回 cookie。相反,我将我想要的数据放在响应正文中的 cookie(加密令牌)中。然后我用角度阅读正文并手动设置cookie。

【问题讨论】:

  • Access-Control-Allow-Credentialsresponse 标头不是 请求标头。换句话说,这应该由服务器设置。 OPTION 请求由用户代理发送以查看在这种情况下我的选择是什么?一旦完成此协商/握手,如果用户代理看到它被给予“继续” " 由服务器,通过将 COR 标头与 Access-Allow-* 响应标头进行比较,它继续执行预期的跨域请求。

标签: angular laravel cookies http-headers access-control


【解决方案1】:

当然,只要您通过 https 连接,您最后描述的方法就可以了。在查询字符串中传输令牌也很常见,尽管我个人不喜欢这种方法。

您发送请求的服务器是否没有正确配置 cors?它应该允许预检请求。

【讨论】:

  • 它允许预检请求,但问题是当我通过 post 请求发送我的用户名和密码时,我想要返回 cookie,存储加密的访问和刷新令牌。为此,我需要设置 Access-Control-Allow-Credentials 标头。因为我设置了它,所以它会发送 OPTIONS 请求。并且不知何故,选项请求也确实设置了不允许的 Access-Control-Allow-Credentials。这导致我的请求被取消。您是否建议 OPTIONS 请求应允许 Access-Control-Allow-Credentials 标头?
  • 不,我的理解是选项请求应始终从身份验证中排除。您的服务器应该以 200 或 204 响应。服务器端,访问控制允许源设置为实际主机,还是通配符 *?
  • 好的,我不明白我会如何阻止浏览器发送预检选项请求。它会在我发送包含我的凭据的发布请求之前自动发送。这样做是因为我设置了 Access-Control-Allow-Credentials 标头。当我将其从发布请求中排除时,不会发送任何选项预检请求,但是当我取回 cookie(我在响应中看到它们)时,它不会存储它们。
猜你喜欢
  • 2022-11-18
  • 2016-12-16
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 2011-03-19
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多