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 浏览器上的主要内容,如果未能解决你的问题,请参考以下文章

Cors 没有物理保存 cookie

XmlHttpRequest CORS POST 未发送 cookie

浏览器不保存从CORS请求获取的身份验证cookie

SignalR Cors Cookie 未发送

如何通过 CORS 传递 cookie?

CORS跨域操作cookie