Axiosは応答ヘッダーフィールドにアクセスできます


159

ReactとReduxを使用してフロントエンドアプリを構築しています。リクエストを実行するためにaxiosを使用しています。応答のヘッダーのすべてのフィールドにアクセスしたいのですが。私のブラウザーでは、ヘッダーを調べて、必要なすべてのフィールド(トークン、uidなど)が存在することを確認できますが、

const request = axios.post(`${ROOT_URL}/auth/sign_in`, props);
request.then((response)=>{
  console.log(response.headers);
});

私はちょうど得ます

Object {content-type: "application/json; charset=utf-8", cache-control: "max-age=0, private, must-revalidate"}

他のすべてのフィールドが表示されていることがわかるように、ここに私のブラウザネットワークタブがあります。

ここに画像の説明を入力してください

ベスト。


axios.defaults.headersを印刷すると、不足しているものがありますか?一部のヘッダーは、各リクエストのレベルではなく、そのレベルで構成されます(github.com/mzabriskie/axios#global-axios-defaultsを参照)
Ben Hare

2
axios.defaults.headersREQUESTヘッダーパラメータを設定するためのものではありませんか?RESPONSEにアクセスする必要があります。@BenHare
TWONEKSONE

ところで、あなたがリクエストと呼んだものは、リクエストではありません。それはあなたの反応の約束です。あなたのリクエストは、引数としてpost()メソッドに渡したものです。
ダニエル

回答:


309

CORS要求の場合、ブラウザーはデフォルトで次の応答ヘッダーにのみアクセスできます。

  • キャッシュ制御
  • コンテンツ言語
  • コンテンツタイプ
  • 期限切れ
  • 最終更新日
  • プラグマ

クライアントアプリが他のヘッダーにアクセスできるようにするには、サーバーでAccess-Control-Expose-Headersヘッダーを設定する必要があります。

Access-Control-Expose-Headers: Access-Token, Uid

悪いことに、そのフィールドを公開するのを忘れていました。
TWONEKSONE 2016年

27
あなたが設定する必要がラックCORSでのRailsを使用している場合expose: ['Access-Token', 'Uid']:のような起源にresource '*', :headers => :any, :methods => [:get, :post, :put, :patch, :delete, :options, :head], expose: ['Access-Token', 'Uid']
CWitty

3
わかりません。それらが公開されていない場合、なぜ追加のヘッダーがブラウザーに表示されますが、axios応答には表示されないのですか?
adanilev

4
@adanilev、ブラウザではデバッグ目的でそれらを表示できますが、セキュリティ上の理由からAPIを介してそれらにアクセスすることはできません。これにより、クライアントがサーバーからセキュリティで保護された資格情報を取得できなくなり、サーバーがクライアントのアクセス権を決定できるようになります。TLDR:それはセキュリティのための目的で行われています
erfling

2
NGINX confgファイルにこれがあります... 'Access-Control-Expose-Headers' 'Authorization, X-Suggested-Filename, content-disposition' always; それでもcontent-type: "application/pdf" 本当にプルする必要があるだけです content-disposition
Old Man Walter

17

これは本当に役に立ちました。あなたの答えをくれたNick Uraltsevに感謝します。

使用してあなたのそれらのためにnodejsCORSを

...
const cors = require('cors');

const corsOptions = {
  exposedHeaders: 'Authorization',
};

app.use(cors(corsOptions));
...

の方法で応答を送信している場合 res.header('Authorization', `Bearer ${token}`).send();


1
不思議に思う人のために、ここで配列を渡すこともできます:exposedHeaders:['Authorization'、 'X-Total-Count']
Thiago Santana

10

私も同じ問題に直面していました。Yは私の「WebSecurity.java」でこれを行いました。それは、cors構成のsetExposedHeadersメソッドに関するものです。

@Bean
CorsConfigurationSource corsConfigurationSource() {

    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowCredentials(true);
    configuration.setAllowedOrigins(Arrays.asList(FRONT_END_SERVER));
    configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
    configuration.setAllowedHeaders(Arrays.asList("X-Requested-With","Origin","Content-Type","Accept","Authorization"));

    // This allow us to expose the headers
    configuration.setExposedHeaders(Arrays.asList("Access-Control-Allow-Headers", "Authorization, x-xsrf-token, Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, " +
            "Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"));

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

うまくいくことを願っています。


7

asp.netコアで同じ問題に直面しましたこれが役立つことを願っています

public static class CorsConfig
{
    public static void AddCorsConfig(this IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
                builder => builder
                .WithExposedHeaders("X-Pagination")
                );
        });
    }
}

1
SOへようこそ!あなたの答えは正しいかもしれませんが、StackOverflowでは、コードのみの答えを投稿することはお勧めしません。あなたの答えが元の質問をどのように解決するかを説明してください。より良い回答
nircraft

ありがとう、それは助けになりました;)
フロリアン

2

公式ドキュメントによると:

これは、サーバーがで応答しHTTPヘッダーが必要な場合に役立ちます。すべてのヘッダー名は小文字であり、ブラケット表記を使用してアクセスできます。例:response.headers['content-type']ヘッダー:{}、


1

SpringBoot2の場合は追加するだけです

httpResponse.setHeader("Access-Control-Expose-Headers", "custom-header1, custom-header2");

あなたのCORSフィルタの実装コードにホワイトリストに登録しているとcustom-header1し、 custom-header2など



0

Spring Boot 2の場合、グローバルCORS構成を使用しない場合は、@CrossOrigin属性付きのexposedHeaders注釈を使用して、メソッドまたはクラス/コントローラーレベルで構成できます。

たとえばauthorizationYourControllerメソッドのヘッダーを追加するには:

@CrossOrigin(exposedHeaders = "authorization")
@RestController
public class YourController {
    ...
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.