【发布时间】:2019-09-11 19:05:25
【问题描述】:
我正在将请求从内容脚本切换到后台脚本,代码相同,但不知何故 XMLHttpRequest 无法让我保持登录状态。
我的目标是登录用户并更改他的密码 - 这需要 2 个 POST 请求。第二个失败了。
后台脚本:
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
// FIRST REQUEST
var loginRequest = new XMLHttpRequest();
loginRequest.open("POST", "https://.../login.php", true);
loginRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
loginRequest.send("user credentials...");
loginRequest.onload = function() {
// SECOND REQUEST
var changeRequest = new XMLHttpRequest();
changeRequest.open("POST", "https://.../changePassword", true);
changeRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
changeRequest.send("old pass... new pass...");
changeRequest.onload = function() {
// ISSUE: changeRequest.responseURL is back at the login page? WHY?
if (changeRequest.responseText.includes("Password successfully changed!")) {
sendResponse({passwordChanged: true});
} else {
sendResponse({passwordChanged: false});
}
}
}
return true;
});
请注意:此代码在内容脚本中运行良好!
【问题讨论】:
-
内容脚本重用了来自网页的 cookie(我猜这些是会话 cookie),因此在后台脚本中执行请求时,您需要在传出请求上设置相同的 cookie,可能通过阅读文档内容脚本中的.cookie,将相关cookies发送到后台脚本,然后通过chrome.webRequest.onBeforeSendHeaders设置'extraHeaders'参数,找例子。
-
也有可能该站点正在检查
Referer标头,因此您必须使用带有“extraHeaders”参数的 chrome.webRequest.onBeforeSendHeaders 手动设置它。 -
按照你说的做了,还是不行...我比较了内容脚本和后台脚本中的请求和响应标头,它们是相同的。
-
Referer标头也一样吗?也可以尝试在 Fiddler 或 mitmproxy 等单独的工具中进行检查。 -
这听起来可能很疯狂,但是当我删除所有 cookie 时我成功了...然后我意识到这可以在没有整个 webRequest API 的情况下仅使用 1 EXTRA LINE 来完成,使用
loginRequest.anonymous = true;这甚至没有出现在文档中。
标签: google-chrome-extension xmlhttprequest