私のアプリでは、アクセストークンが必要なIBM Watson Speech-to-Textを使用しています。コマンドラインから私はカールとアクセストークンを取得することができます:私は角の$http
サービスを使用してHTTPリクエストを行うとFirebaseとAngularを使用してHTTP GETリクエストを送信するにはどうすればよいですか?
curl -X GET --user my-user-account:password \
--output token \
"https://stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api"
私はCORSエラーを取得:
var data = {
user: 'my-user-account:password',
output: 'token'
};
$http({
method: 'GET',
url: 'https://stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api',
data: data,
}).then(function successCallback(response) {
console.log("HTTP GET successful");
}, function errorCallback(response) {
console.log("HTTP GET failed");
});
エラーメッセージは言う:
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://127.0.0.1:8080 ' is therefore not allowed access. The response had HTTP status code 401.
私が理解しているように、AngularからCORSを実行することはできません。 CORSはサーバーから実行する必要があります。ノードでCORSを実行する方法は分かっていますが、Firebaseをサーバーとして使用しています。
CORSでHTTPリクエストを作成することについてFirebaseはdocumentationを持っています。ドキュメントには次のように書かれています。
$scope.getIBMToken = functions.https.onRequest((req, res) => {
cors(req, res,() => {
});
});
まず、これは機能しません。エラーメッセージはfunctions is not defined
です。明らかにfunctions
はFirebaseライブラリにありませんか?私はindex.html
からFirebaseを呼び出す:
<script src="https://www.gstatic.com/firebasejs/4.3.0/firebase.js"></script>
私のコントローラは$firebaseArray
、$firebaseAuth
、そして$firebaseStorage
の依存関係を注入します。 $firebaseHttp
などの依存関係を注入する必要がありますか?
第2に、方法( 'GET')、URL、およびデータ(アカウントとパスワード)を指定するにはどうすればよいですか?
簡単な答えは、トークンジェネレータエンドポイントがCORS対応ではないことです。つまり、ブラウザで実行されているフロントエンドJavaScriptコードからのクロスオリジン要求の受信をサポートしていないため、それを呼び出すことができるようになるのは次のいずれかです:(A)代わりにバックエンドコードからリクエストを行います。または(B)https://github.com/Rob--W/cors-anywhere/などのコードを使用してCORSプロキシを設定し、フロントエンドコードでそのCORSプロキシを介してリクエストを行うようにしてください – sideshowbarker
そのAPI認証が必要ですが、明らかに 'GET'リクエストの一部としてこれらの信用証明書を送信する必要があります。次に' Authorization:Basic bXk ... 'リクエストヘッダをリクエストに追加します。ここで' bXk ... 'はあなたのBase64エンコーディング実際のアカウント名とパスワードは* account:password *形式になりますが、試してみると、それも401で失敗します。リクエストに 'Authorization'ヘッダを追加するとブラウザは自動的にCORSを実行しますコードで 'GET'リクエストを試す前に' OPTIONS'リクエストをプリフライトしてください。プリフライトは失敗します。 – sideshowbarker
CORSのプリフライトが失敗するのは、トークンジェネレータのエンドポイントが 'OPTIONS'リクエストの認証を要求していることですが、ブラウザは' OPTIONS'リクエストに 'Authorization'ヘッダーを追加しません。なぜなら、プリフライトの目的は、そのヘッダーを含むクロスオリジン要求を受信することがOKであるかどうかをサーバーに尋ねることだからです。 – sideshowbarker