我有一个跨域AJAX GET成功预先通过,但cookie没有附加到GET请求.当用户单击登录按钮时,将进行POST以将用户登录,这可以跨域正常工作.JavaScript是:
$.ajax(signin_url, {
type: "POST",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(credentials),
success: function(data, status, xhr) {
signInSuccess();
},
error: function(xhr, status, error) {
signInFailure();
},
beforeSend: function(xhr) {
xhr.withCredentials = true
}
});
Run Code Online (Sandbox Code Playgroud)
响应标头包含一个cookie:
Set-Cookie:user_token=snippysnipsnip; path=/; expires=Wed, 14-Jan-2032 16:16:49 GMT
Run Code Online (Sandbox Code Playgroud)
如果登录成功,则会发出JavaScript GET请求以获取当前用户的详细信息:
function signInSuccess() {
$.ajax(current_user_url, {
type: "GET",
contentType: "application/json; charset=utf-8",
success: function(data, status, xhr) {
displayWelcomeMessage();
},
beforeSend: function(xhr) {
xhr.withCredentials = true;
}
});
}
Run Code Online (Sandbox Code Playgroud)
从Chrome的OPTIONS请求返回的与CORS相关的标头是:
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:X-Requested-With, X-Prototype-Version, Content-Type, Origin, Allow
Access-Control-Allow-Methods:POST, GET, OPTIONS
Access-Control-Allow-Origin:http://192.168.0.5
Access-Control-Max-Age:1728000 …Run Code Online (Sandbox Code Playgroud) 我正在使用基于会话的授权在不同的域上使用前端和后端应用程序.我已经设置了一个有效的CORS配置,它可以按预期工作localhost(例如从端口:9000到端口:8080).一旦我在安全域上部署应用程序(两个域都只允许HTTPS),在JavaScript中就不再可以访问CSRF cookie,从而导致前端的错误后续请求(缺少CSRF头).
cookie由Set-Cookie标题中的后端设置,不使用HttpOnly标志.它实际上设置在浏览器的某个位置,因为后续请求包含会话cookie和CSRF cookie.尝试通过JavaScript访问它(使用例如document.cookie在控制台中)返回一个空字符串.DevTools of Chrome不会在前端域上显示任何 cookie(后端域甚至没有列出).
我期待cookie被设置并在当前域(前端域)上可见.我正在使用axios库的withCredentials标志.
你有什么想法,为什么不能从JavaScript或Chrome中的DevTools访问cookie?这与Strict-Transport-Security标题有什么关系吗?
1.初始GET响应标头
HTTP/1.1 401 Unauthorized
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://[my-frontend-domain]
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Encoding: gzip
Content-Type: application/json;charset=UTF-8
Date: Wed, 20 Sep 2017 11:57:07 GMT
Expires: 0
Pragma: no-cache
Server: Apache-Coyote/1.1
Set-Cookie: CSRF-TOKEN=[some-token]; Path=/
Vary: Origin,Accept-Encoding
X-Content-Type-Options: nosniff
X-Vcap-Request-Id: [some-token]
X-Xss-Protection: 1; mode=block
Content-Length: [some-length]
Strict-Transport-Security: max-age=15768000; includeSubDomainsRun Code Online (Sandbox Code Playgroud)
2.后续POST请求标头
我在 Django 项目中的会话面临一个大问题。
后端托管在.my-domain.org,前端使用后端的 REST API .front-end.com。将来,可能会出现完全不同域上的其他前端。
使用django提供的session框架时出现这种情况如何处理?似乎SESSION_COOKIE_DOMAIN只允许在一个子域上设置会话 cookie 。结果是,如果我希望能够在.my-domain.org(ie, SESSION_COOKIE_DOMAIN = None)登录,那么.front-end.com当它调用 API 端点时我无法接收会话 cookie 。另一方面,设置SESSION_COOKIE_DOMAIN为.front-end.com会阻止我连接到站点管理员。SESSION_COOKIE_PATH当然,情况也受到影响...
任何帮助都非常受欢迎。我很确定我不是第一个需要可以从外部域访问具有会话身份验证的 REST API 的人。
我正试图用jquery购买执行CORS请求我得到了奇怪的行为.当我使用curl执行请求时,一切正常.但是当我使用jQuery时,事情发生了可怕的错误.在我的浏览器的"网络"选项卡中,我可以检查请求和来自后端的响应,一切都是正确的
但是虽然我有Access-Control-Expose-Headers:Set-Cookie标头当我尝试使用console.log打印出来时我得到null(response.getResponseHeader("Set-Cookie")); 当我尝试使用console.log(response.getAllResponseHeaders())在控制台中打印出我的ajax请求的响应头时,我只得到这3个头:
Pragma: no-cache
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Expires: 0
Run Code Online (Sandbox Code Playgroud)
我用来执行请求的代码是:
$.ajax({
method: "POST",
url: "http://localhost:8808/storage/login",
data: {
username: email,
password: password,
},
success: function(data, textStatus, response){
console.log(response.getAllResponseHeaders());
console.log(response.getResponseHeader("Set-Cookie"));
this.setState({showAlert: true, alertMessage: "You are logged in.", alertType: "success"});
}.bind(this),
error: function (xhr, status, err) {
this.setState({showAlert: true, alertMessage: "Wrong email or password", alertType: "danger"});
}.bind(this)
});
Run Code Online (Sandbox Code Playgroud) 我有一个 PHP 脚本,如果直接在浏览器中(或由邮递员)调用,它会成功返回一些简单的标头以及 set-cookie 标头。我可以从 chrome devTools 读取这样的响应头。但是一旦我通过 Axios 调用它,set-cookie 标头就不会显示,并且浏览器中也没有保存 cookie。
我尝试了不同的事情,比如更改响应头服务器端和使用 "withCredentials: true" 和 axios,但没有任何效果。我什至没有收到错误或任何与 cors 相关的问题。
PHP:
header("Access-Control-Allow-Origin: http://localhost:8080");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST, GET");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
header("Access-Control-Max-Age: 99999999");
setcookie("TestCookie", "Testing", time() + 3600, "/", "localhost", 0);
die();
Run Code Online (Sandbox Code Playgroud)
JS:
Vue.prototype.$http = axios.create({
baseURL: XYZ,
withCredentials: true
})
Run Code Online (Sandbox Code Playgroud)
所以我的第一个问题是为什么直接调用php脚本时会出现header?以及如何存档以通过 axios 获取标题?
即使服务器响应包含正确的Set-Cookie标头,我的 Laravel 会话 cookie 也不会在浏览器中设置。Laravel 服务器运行在 localhost:8000,客户端应用程序是一个运行在 localhost:7000 的 NuxtJS SPA。
包含的响应头Set-Cookie如下:
HTTP/1.1 200 OK
Host: localhost:8000
Date: Sun, 06 Sep 2020 00:50:31 GMT
Connection: close
X-Powered-By: PHP/7.4.10
Cache-Control: no-cache, private
Date: Sun, 06 Sep 2020 00:50:31 GMT
Content-Type: application/json
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, PATCH, DELETE
Access-Control-Allow-Headers: Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Authorization, Access-Control-Request-Headers, Set-Cookie
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
Set-Cookie: dv_session=ifhSq8WFD2Upltr5v2bzNBgaA5xx3KiDVuMWuBge; expires=Sun, 06-Sep-2020 02:50:31 GMT; Max-Age=7200; path=/
Run Code Online (Sandbox Code Playgroud)
通过邮递员发出相同的请求,cookie被保存:
因此,浏览器似乎忽略了“Set-Cookie”标头。
我的 session.php 文件如下: …