浏览器未设置CORS cookies,但响应中存在cookies。

3

我正在发送http请求到node.js服务器的API端点,该响应包含cookie并在mozilla调试器中显示。我通过localhost.org或虚拟主机(例如myapp.example.com)发送此请求。

我尝试使用AJAX XMLHTTPRequest和angular http,还为AJAX添加了xhrFields: {withCredentials:true} credentials:'include'适用于fetch等。

但是浏览器未设置cookie,我已经尝试了2天,但问题尚未解决。

这是一个发送ajax请求的实用函数

function sendServerRequest(url,method,data) {
return new Promise(function ( resolve ) {
    resolve($.ajax({
        url,
        method: method || 'GET',
        data,
        xhrFields: {withCredentials: true},
        crossDomain: true,
        success: function ( data ) {
            return data
        },
        error: function ( err ) {
            try {
                let responseStatus = err.responseJSON
                if ( responseStatus.status === sessionExpires ) {
                    sessionExpireCall(responseStatus.message)
                }
            } catch ( e ) {
                console.log('Failed to get response');
            }
        }
    }));
 })
}

响应原始内容

HTTP/1.1 200 OK
X-RateLimit-Limit: 13000
X-RateLimit-Remaining: 12996
Date: 2019-06-26 06:17:56
X-RateLimit-Reset: 1561533343
X-DNS-Prefetch-Control: off
X-Frame-Options: SAMEORIGIN
Strict-Transport-Security: max-age=15552000; includeSubDomains
X-Download-Options: noopen
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Access-Control-Allow-Origin: http://192.168.10.3
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type,             
Authorization
Access-Control-Allow-Credentials: true
set-cookie: true
set-cookie: driverId=c81e728d9d4c2f636f067f89cc14862c; Max-Age=3600;       
Domain=192.168.10.3; Path=/; Expires=Wed, 26 Jun 2019 07:17:56 GMT
set-cookie: driverName=kamran; Max-Age=3600; Domain=192.168.10.3; Path=/; 
Expires=Wed, 26 Jun 2019 07:17:56 GMT
set-cookie: connect.sid=s%3AX- syECgzpFEZhh4d5B_xfStUoYPrO3p1.%2FPj%2BMo7UnaZto6OGoP%2BOjdKvrJ%2F3Fm%2Bn1BJ%2FXU7Qdh8; Domain=192.168.10.3; Path=/; Expires=Wed, 26 Jun 2019 07:17:56 GMT; HttpOnly
Content-Type: application/json; charset=utf-8
Content-Length: 34
ETag: W/"22-tpsDmOyD3m/F84/JvyRCwDCbeY8"
Connection: keep-alive

{"detail":"verified","status":200}

请求原始数据

GET http://localhost:3000/driverboard/verifycode? 
mobile=923002222222&vcode=2609 HTTP/1.1
Host: localhost:3000
Connection: keep-alive
Accept: */*
Origin: http://192.168.10.3
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
Referer: http://192.168.10.3/capptin-driverboard/verification.php
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: true

http request snapshot


我认为问题在于Cookie域名.localhost.org与浏览器页面中的不相等。你能检查一下吗?如果是这种情况,我稍后会发布关于原因等详细答案。 - Hash
我也尝试过使用本地主机名和IP地址(192.168.1.3)进行访问,当我从本地主机打开网站并请求本地服务器时,或者从(192.168.1.3)打开网站并请求位于192.168.1.3的服务器时,一切都正常运行。 - Basit
只有在从不同地址打开网页并请求不同的URL时才会出现此问题,例如如果从192.168.1.3打开网页并在localhost上请求,则不会存储cookie,即使响应中存在cookie,如快照所示。 - Basit
我看不到原始请求。我错过了什么吗? - Hash
请检查一遍。 - Basit
显示剩余2条评论
2个回答

6

CORS并不涉及到Cookies,CORS涉及到HTTP头部。它允许进行跨域请求(从一个域向另一个域发起请求。例如从myapp.example.com到google.com)。Cookies仅发送到同一域名,例如从myapp.example.com您可以将Cookies发送到相同的域名.example.com。

文档在这里https://developer.mozilla.org/ru/docs/Web/HTTP/CORS


感谢@Alexey的回复,我明白了,但我想在浏览器中保存cookies。 我的请求是从myapp.example.com到somedomain.com。 我还在请求和响应中添加了必要的头文件。 - Basit

2
您可以在响应中使用“/”作为路径附加Cookie。
在C# Core中添加Cookie。将其附加到响应中:
context.Response.Cookies.Append(cookieNameAsString, cookieValue, new CookieOptions()
    {
        Expires = time,
         Path = "/",
     });

or create a cookie in javascript:

document.cookie = "cookieNameAsString='cookieValue'; max-age=time;";

请确保您的过期日期在未来。您能展示一下您的代码吗? - Janneck Lange
我已经发布了原始请求和响应,你可以看到所有必需的标头都存在,并且响应中也设置了cookies。 - Basit
我更新了我的问题并添加了Ajax请求的代码。 - Basit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接