我正在开发一个与Heroku API交互的 Chrome 扩展,但似乎使用XMLHttpRequest
(XHR) 发出的请求的处理方式与curl
. 特别是,Basic Auth 似乎没有与 XHR 一起使用,而是与 cookie 一起使用。
因此,如果我运行以下命令:
curl https://:yourapitokengoeshere@api.heroku.com/user -H "Accept: application/json"
我得到了没有问题的正确结果。
另一方面,如果我在 Chrome JavaScript 控制台中为我的扩展页面运行以下命令,请求的成功将取决于我是否登录到 Heroku。
var xhr = new XMLHttpRequest()
xhr.open("GET", "https://api.heroku.com/user", false, "", "yourapitokengoeshere")
xhr.setRequestHeader("Accept", "application/json")
xhr.send()
如果我已登录,我会得到curl
与xhr.responseText
. 如果我退出,我会得到GET https://:yourapitokengoeshere@api.heroku.com/user 401 (Unauthorized)
. 我可以从网络选项卡中看到 cookie 被传递,Heroku 基于它的响应而不是 API 令牌作为传递的密码传递XMLHttpRequest::open
。(我也尝试在https://:yourapitokengoeshere@api.heroku.com/user
不使用用户名、密码参数的情况下打开,结果相同(如预期的那样,但值得一试))
如果您想尝试一下,我manifest.json
的方法很简单:
{
"name": "Testing Heroku.js",
"version": "0.1",
"background": {
"page": "test.html"
},
"permissions": [
"cookies",
"https://api.heroku.com/"
],
"manifest_version": 2
}
并且test.html
只是一个空文件,因此我可以打开检查视图并在扩展的上下文中访问控制台。在任何地方创建这两个文件并将封闭目录加载为未打包的扩展名。
所以我的问题是:我能做些什么吗?我错过了什么吗?Heroku API 有问题吗?或者XMLHttpRequest
?我倾向于 API 行为不端……</p>
更一般地说,我有兴趣了解XMLHttpRequest
通话和curl
通话之间的区别。
根据我的研究,我似乎无法在XMLHttpRequest
没有 cookie 的情况下使用,也无法更改用户代理以使其看起来像curl
. 我还尝试了一些方法来使 curl 表现得像XMLHttpRequest
(更改用户代理,使用相同的标题),但curl
总是按预期工作。
谢谢!