CORS - 服务器端 cookie 未保存在 chrome 浏览器上
Posted
技术标签:
【中文标题】CORS - 服务器端 cookie 未保存在 chrome 浏览器上【英文标题】:CORS - Server side cookie is not getting saved on chrome browser 【发布时间】:2016-09-13 10:52:20 【问题描述】:有一个节点服务器在接受用户的正确凭据后,passport js 会在请求标头中按 set-cookie 的名称创建并发送会话 cookie。
但是当我从我的 chrome 浏览器执行 ajax 请求 接受请求时,它不会在客户端添加 cookie。因此,当从客户端生成新请求时,服务器不会对其进行身份验证并抛出 401。
我很困惑是浏览器问题还是我从 AJAX 请求中遗漏了什么
请帮忙。
【问题讨论】:
你碰巧知道哪个域服务器正在创建 cookie 吗? cookie域和网站域冲突的可能原因之一。 简单的 cors-needing 请求(来自第 3 方的请求)不允许使用 cookie。 您能分享一下您用于执行 ajax 请求的代码,以及身份验证服务器和网站的域吗?正如@MaheshChavda 建议的那样,可能是 CORS 问题;某些浏览器在执行跨域 ajax 请求时拒绝处理Set-Cookie
标头。您可以使用credentials
添加适当的选项,如此答案***.com/questions/8863571/… 或(带角度)中建议的那样:***.com/questions/19383311/…。
检查服务器是否设置正确也很有意义:***.com/questions/37090621/…
【参考方案1】:
如果你使用'fetch',你需要添加一个key
headers: req.headers,
credentials: 'include'
【讨论】:
我想知道谁投了反对票,因为这对fetch()
来说是绝对正确的。【参考方案2】:
感谢您的回答。我正在尝试 withCredentials
的东西,但会话 cookie 没有在我的本地设置。
我发现的原因是允许的来源。我需要在后端设置允许的来源。
如果使用凭证属性传递,XHR by 是一个安全请求。因此,客户端浏览器仅在允许的来源与请求来源匹配时才保存 cookie。
所以简单的解决方法是将主机更改为与允许的来源匹配的内容。
在节点端我需要做origin: 'domain.com'
在前端,我需要将我的服务器(localhost)设置为指向 test.domain.com。和宾果游戏。成功了!
【讨论】:
【参考方案3】:我在 Chrome 中使用 Angular 4 时遇到了这个问题(IE 工作正常)。
从 localhost:4200 上的客户端到 localhost:24336 上的 WebApi 的请求。 拥有所有 CORS 设置,“Access-Control-Allow-Credentials” value="true" "Access-Control-Allow-Origin" value="http://localhost:4200" 等,并且正在通过 withCredentials: true 在每个请求中,例如 http.post(url, , withCredentials: true ) 。
对我来说,解决方法是按照https://angular.io/api/http/BaseRequestOptions 的步骤将默认 RequestOptions 设置为 withCredentials: true 并将以下内容添加到提供程序:在 app.module.ts 中
,provide: RequestOptions, useClass: MyOptions
【讨论】:
【参考方案4】:如果您使用 XHR 请求,则需要将 withCredentials
设置为 true。如果没有,应该可以解决问题,请提供代码
【讨论】:
你能用一些示例代码扩展你的答案吗?以上是关于CORS - 服务器端 cookie 未保存在 chrome 浏览器上的主要内容,如果未能解决你的问题,请参考以下文章