クロスドメイン通信でhttp status code が0


# 前提

  * XMLHTTPRequestで別ドメイン（Bサイトという）にアクセスする処理
  * Bサイトは、認証機能がありRequest Headerにトークンを渡す必要がある
  * 認証された場合、http status code 200とレスポンスが返ってくる
  * 認証されなかった場合、http status code 401が返ってくる

# 質問

BサイトへXMLHTTPRequestでアクセスし、認証されなかった場合、  
Javascriptでhttp statusを取得すると status code は 0 になっています。  
なぜ、0が返ってくるのでしょうか。  
chrome 開発者ツールのnetworkは、401を返しています。

<https://teratail.com/questions/21794>  
で同様の質問がありましたが、解決されていないため、質問させていただきます。

## プレフライトリクエスト

[![画像の説明をここに入力](https://i.stack.imgur.com/rWlRo.png)](https://i.stack.imgur.com/rWlRo.png)

## 実際のリクエスト (status 401が返ってきている)

[![画像の説明をここに入力](https://i.stack.imgur.com/E2ECV.png)](https://i.stack.imgur.com/E2ECV.png)

## Javascript （status 0になっている）

[![画像の説明をここに入力](https://i.stack.imgur.com/TPxPg.png)](https://i.stack.imgur.com/TPxPg.png)




サーバー側の設定を変更することで解決できました。  
サーバはAmazon API Gatewayを使用しており、カスタムオーソライザーで弾かれた場合、Access-Control-Allow-
Origi‌​nヘッダーがレスポンスに付与されないため‌​、問題が生じていたようです。

以下のフォーラムで議論されています:  
[https://forums.aws.amazon.com/thread.jspa?threadID=228211&start=25&tstart=0](https://forums.aws.amazon.com/thread.jspa?threadID=228211&start=25&tstart=0)

フォーラムの回答で先月このユースケースに対応した旨の記載があったため、以下ドキュメントを参考に設定を試したところ、認証エラー時に401を取得することができました。  
<http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/customize-
gateway-responses.html#supported-gateway-response-types>




[RFC7235 3.1. 401 Unauthorized](https://www.rfc-
editor.org/rfc/rfc7235#section-3.1)から引用します。

> The 401 (Unauthorized) status code indicates that the request has not been
> applied because it lacks valid authentication credentials for the target
> resource. **The server generating a 401 response MUST send a WWW-
> Authenticate header field** (Section 4.1) containing at least one challenge
> applicable to the target resource.

と401レスポンスには`WWW-Authenticate`ヘッダーが必須です。しかし画像を見る限り`WWW-
Authenticate`が含まれていません。このためブラウザーは認証処理をできずに困ったためエラーと見なしたのだと思います。

エラー時に`XMLHttpRequest.status`が`0`を返すのはmaotさんの回答の通りです。

