我正在处理Chrome扩展程序的功能,该功能需要向端点发出同源POST请求。为简洁起见,我将忽略网站的特定细节。此请求创建给定类型的资源。我已经成功地创造了许多这样的资源,但特别是有一种类型总是失败。
当您使用网站自己的UI创建此类资源时,我注意到生成的POST请求与cookie
标头一起发送,以及其他一些我不熟悉的内容。这是请求标题的摘录:
:authority:www.example.com
:method:POST
:path:/path/to/endpoint
:scheme:https
[...]
cookie: [...]
对于任何其他资源类型,只发送
。现在,由于这传递了cookie,网站自己的javascript无法使用ajax。事实上,该网站通过将<iframe>
与特定名称的<form>
相关联来发布到<iframe>
。
因此,我修改了我的Chrome扩展程序代码,使用表单发布到iframe而不是发出ajax请求,就像它在网站上原生一样。但是,生成的POST请求仍然不会传递cookie。我发现网站的UI部分没有任何独特之处,这些部分会创建这些可能导致请求传递cookie的特殊资源。
Chrome如何决定何时在网络请求中传递Cookie?如何强制它为<form>
提交执行此操作?
编辑:根据要求,这里有更多细节。
要创建资源,只需将多部分数据POST到/resource-endpoint
即可。在jQuery中,您可能会执行类似
var data = new FormData();
data.append('property', 'value'); // Add payload values
$.ajax({
url: '/resource-endpoint'
type: 'POST',
cache: false,
contentType: false,
processData: false,
data: data
});
这样做会创造大部分资源,除了&#34;特殊&#34;资源。由于AJAX请求无法传递cookie,并且请求创建&#34;特殊&#34;资源必须包含cookie,我必须更密切地模仿网站的用户界面。
var id = 'some-id';
var iframe = $('<iframe name="' + id + '"></iframe>');
$(document.body).append(iframe);
var form = $('<form></form>');
form.attr({
target: id,
action: '/resource-endpoint,
method: 'POST',
enctype: 'multipart/form-data'
});
// Add payload values
form.append('<input name="property" value="value" />');
$(document.body).append(form);
form.submit();
这仍然会发送请求,但似乎缺少某些内容,因为要求创建&#34;特殊&#34;资源不包含cookie。我不确定原生网站javascript是如何做到这一点的,因为我无法找到创建常规资源的表单与创建特殊表单的表单之间的任何差异。资源。
编辑:没关系,我看到了一个原生的特殊资源&#34;来自UI的POST请求没有传递这些cookie,因此秘密不能是cookie。