我目前正在使用 CORS 方法(将我的外部请求从 example.com/api?param=args
重写为 example.com/api/public/api.php?param=args
)并发送如下所示的 get 请求:
$.get('http://www.example.com/api'), { param: "args" })
.done(function (data) {
alert(data);
});
这绝对可以正常工作,我现在可以使用对我的 API 软件的请求和响应进行跨域引用。
我现在想知道,我设置了一个测试请求以尝试实现Session
.
session_start();
if(isset($_GET['store'])):
$_SESSION['key'] = $_GET['store'];
elseif(isset($_GET['show'])):
echo $_SESSION['key'];
endif;
当我直接在浏览器中访问链接时,这工作正常,但是,当我从外部域发送请求时,第二个请求似乎"忘记"了我存储的Session key
。
法典:
$.get('http://www.example.com/api'), { store: "test" })
.done(function () {
$.get('http://www.example.com/api'), { show: "args" })
.done(function (data) {
alert(data);
})
});
数据未定义
有没有办法让发送请求的服务器实际上"保存"或"记住"API服务器上的会话,或者有没有办法通过使用解决方法来实现这一点?
请注意,该 API 将由多个人使用 - 就像插件一样 - 一旦他们发送一个Register
带有该帐户管理员详细信息的请求,每个key
都会被实际添加,所以我需要某种身份验证来使用 API,并且实际上想不出不使用会话或使用会话使其工作的方法。
另请注意,如果我正在使用会话(如您所见),它会创建一个CRSF attack
。也有解决方法吗?
默认情况下,凭据(如 Cookie)不会在跨源请求时发送,因为它们会触发预检请求。
jQuery 文档描述了如何启用凭据:
$.ajax({
url: a_cross_domain_url,
xhrFields: {
withCredentials: true
}
});
在实际上想不出不使用会话的方法
响应正文中传递身份验证令牌。用 JS 阅读它。让 JS 将其包含在每个请求中。
另请注意,如果我使用会话(如您所见),它会产生 CRSF 攻击。也有解决方法吗?
不要在访问控制允许源标头中使用*
源。仅允许受信任的站点使用您的 API。