2

我正在开发一个与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()

如果我已登录,我会得到curlxhr.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总是按预期工作。

谢谢!

4

2 回答 2

1

Heroku 支持团队的回答:

这是 Rails 的怪异之处。直到最近,该 API 还处理了 Web UI 等,因此在这种情况下假定 XHR 不是 API 请求,而是来自 API 网站上的最终用户的请求是正常的。

希望在不久的将来,我们的 API 将不再与这种行为相关联,并且也将被宣布为适当的产品(带有适当的文档)。

所以,问题出在 API 上。

于 2012-10-16T02:33:41.733 回答
1

您需要按如下方式生成 Heroku 密钥:

herokuKey = btoa(":" + herokuToken + "\n")

然后使用适当的标题提出您的请求。

xhr = new XMLHttpRequest()
xhr.open("GET", "https://api.heroku.com/apps")
xhr.setRequestHeader("Accept", "application/vnd.heroku+json; version=3")
xhr.setRequestHeader("Authorization", herokuKey)
xhr.send()

我从这篇文章中拼凑起来:https ://devcenter.heroku.com/articles/platform-api-quickstart并使用您的示例使其适应网络。

于 2014-01-15T20:22:11.790 回答