1. ホーム
  2. angular

[解決済み] angularでpreflightのレスポンスがHTTP okステータスにならない

2022-02-02 23:49:33

質問

私のサービスでは、次のようなgetリクエストが定義されています。

createAuthorizationHeader(user, pass) {
  let headers: HttpHeaders = new HttpHeaders;
  headers = headers.append('Accept', 'application/json, text/plain, */*');
  headers = headers.append('Authorization', 'Basic ' + btoa(user + ':' + pass));
  headers = headers.append('Content-Type', 'application/json; charset=utf-8');
    console.log(headers);
    return this.http.get(this._loginUrl, {
      headers: headers
    });
}

その結果、次のようになります。

OPTIONS https://localhost:8443/delivery/all 401 ()

Failed to load https://localhost:8443/delivery/all: Response for preflight does not have HTTP ok status.

HttpErrorResponse {headers: HttpHeaders, status: 0, statusText: "Unknown Error", url: null, ok: false, …}

また、Postmanで同じpost requestをしましたが、すべてうまくいったので、ローカルサーバは機能しています。

私のリクエストの何が間違っているのかがわかりません。

どうすればいいですか?

CORS 契約では、飛行前の OPTIONS リクエストで認証が要求されないことが要求されています。あなたのバックエンドは、OPTIONSリクエストとGETで認証を要求しているように見えます。

Postmanでバックエンドにアクセスするとき、あなたはGETを送信しているだけです。 ブラウザはまずOPTIONSリクエストを送信し(認証ヘッダなし)、そのレスポンスにリクエストを行ったページのオリジンに一致する "Access-Control-Allow-Origin"ヘッダがあるかどうか探します。

OPTIONSリクエストに対するレスポンスが2xxでない場合、またはヘッダーが存在しない場合、またはヘッダー値がリクエストページのオリジンと一致しない場合、あなたが経験しているエラーが発生し、GETリクエストは行われないでしょう。

TLDR; OPTIONSメソッドでログインURLを処理する際に、認証を必要としないようにバックエンドを変更すること。