2

Heroku APIと相互作用するChrome拡張機能に取り組んでいますが、(XHR)で行われたリクエストはとXMLHttpRequest同じように処理されないようcurlです。特に、基本認証は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::openhttps://: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これは単なる空のファイルなので、ビューを開いて検査し、拡張機能のコンテキストでコンソールにアクセスできます。これらの2つのファイルを任意の場所に作成し、それを囲むディレクトリを解凍された拡張子としてロードします。

だから私の質問は:それについて私ができることはありますか?私は何かが足りないのですか?Heroku APIに何か問題がありますか?またはXMLHttpRequest?APIの誤動作に傾倒しています…</p>

XMLHttpRequestより一般的には、通話と通話の違いを理解することに興味がありcurlます。

私の調査によると、 XMLHttpRequestCookieなしでは使用できないようで、ユーザーエージェントを変更してのように見せることはできませんcurl。また、curlを次のように動作させるためにいくつかのことを試みましたXMLHttpRequest(ユーザーエージェントを変更し、同じヘッダーを使用します)が、curl常に期待どおりに機能しました。

ありがとう!

4

2 に答える 2

1

Herokuのサポートチームからの回答:

これはRailsの奇妙さです。APIは、ごく最近までWeb UIなども処理していたため、その場合、XHRを想定するのはAPIリクエストではなく、APIWebサイトのエンドユーザーからのリクエストです。

うまくいけば、それほど遠くない将来に、私たちの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の記事からまとめ、例を使用してWebに適合させました。

于 2014-01-15T20:22:11.790 に答える