AxiosにリクエストでCookieを自動的に送信させる


121

Axiosを使用してクライアントからExpress.jsサーバーにリクエストを送信しています。

クライアントにcookieを設定し、手動で追加することなく、すべてのAxios要求からそのcookieを読み取ります。

これは私のクライアント側のリクエストの例です:

axios.get(`some api url`).then(response => ...

Express.jsサーバーで次のプロパティを使用して、ヘッダーまたはCookieにアクセスしようとしました。

req.headers
req.cookies

どちらにもCookieは含まれていませんでした。私はクッキーパーサーミドルウェアを使用しています:

app.use(cookieParser())

AxiosにリクエストでCookieを自動的に送信させるにはどうすればよいですか?

編集:

私はこのようにクライアントにクッキーを設定しました:

import cookieClient from 'react-cookie'

...
let cookie = cookieClient.load('cookie-name')
if(cookie === undefined){
      axios.get('path/to/my/cookie/api').then(response => {
        if(response.status == 200){
          cookieClient.save('cookie-name', response.data, {path:'/'})
        }
      })
    }
...

Axiosも使用していますが、問題には関係ありません。Cookieが設定されたら、すべてのリクエストにCookieを埋め込みたいだけです。


1
どのようにしてクライアントにCookieを設定しましたか?コード例を表示してください:)
Tzook Bar Noy

@TzookBarNoy追加された問題のコード
Kunok

CookieはクライアントではなくSet-Cookieを使用してサーバーによって設定されます。つまり、クライアントでCookieを読み取ることになります。Cookieプロトコルによると、クライアントはCookie発行者サーバーへの要求にCookieヘッダーを含める必要があります。
Hans Poo

回答:


241

同じ問題があり、withCredentialsプロパティを使用して修正しました。

別のドメインからのXMLHttpRequestは、リクエストを行う前にwithCredentialsがtrueに設定されていない限り、独自のドメインにCookie値を設定できません。

axios.get('some api url', {withCredentials: true});

8
Expressアプリに接続しようとしている場合-corsを使用し、これらの設定を使用する必要があります。リクエストの発信元は必須です。app.use(cors({credentials:true、origin: ' localhost:8080 '}));
DogCoffee 2017年

17
これはAccess-Control-Allow-Origin、応答ヘッダーがワイルドカード(*)に設定されていない場合にのみ機能することに注意してください
Jerry Zhang

1
@JerryZhangどういう意味ですか?同じ問題に直面していますが、それAccess-Control-Allow-Originが設定され*ていない場合、CORSの権利のため、そのサーバーにリクエストを送信しません
samayo

5
応答ではAccess-Control-Allow-Origin、XHRリクエストを送信するドメインにの値を設定する必要があります。たとえばhttps://a.com、サーバー、https://b.comクライアントでありhttps://b.com、誰かのブラウザに読み込まれ、XMLHTTPRequestへのリクエストに使用されていhttps://a.comます。用加えてXMLHTTPRequest(で開始https://a.comセットに)withCredential: true、サーバ-はhttps://b.com、応答ヘッダに含まれるように設定する必要Access-Control-Allow-Origin: https://a.com
ジェリー張

私はこれに少し問題があります...クライアントとしてサーバーbがある場合(つまり、ページを反応させる)、これをtrueに設定した場合よりも、b資格情報ではなく、資格情報を送信します...笑。 ..わかりました、面白くないです。
golddragon007 2017年

24

TL; DR:

{ withCredentials: true } または axios.defaults.withCredentials = true


axiosのドキュメントから

withCredentials: false, // default

withCredentials 資格情報を使用してクロスサイトAccess-Control要求を行う必要があるかどうかを示します

あなたが{ withCredentials: true }あなたの要求で合格した場合、それはうまくいくはずです。

より良い方法を設定することになるwithCredentialsようtrueaxios.defaults

axios.defaults.withCredentials = true


5
すべてのリクエストで認証情報を送信することは悪い習慣です。これらのコントロールは、理由のために配置されています。別のサービスと通信して、すべてのCookieを送信する-Cookieが使用されているかどうかに関係なく、悪用される可能性があります。
colm.anseo

2
@colminatorは、ドメインがサーバードメインであるCookieのみを送信します。(デフォルトでは、サブドメインにも送信されず、パスに基づいてさらにフィルタリングすることができます。)実際には、サーバーによって設定されたサーバーCookieのみを送信します。
M3RS

15

私はAxiosに精通していませんが、javascriptおよびajaxで知る限り、オプションがあります

withCredentials: true

これにより、Cookieが自動的にクライアント側に送信されます。例として、このシナリオは、サーバーにCookieを設定するpassportjsでも生成されます


11

エクスプレスレスポンスで必要なヘッダーを設定することも重要です。これらは私のために働いたものです:

app.use(function(req, res, next) {
  res.header('Access-Control-Allow-Origin', yourExactHostname);
  res.header('Access-Control-Allow-Credentials', true);
  res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
  next();
});

追加するX-PINGOTHERには、Access-Control-Allow-Headers私のために(エクスプレス4.16、クロム63とのNode.js 6.9)は必須となっています。このGitHubの問題に関するJakeElderの投稿を確認してください:github.com/axios/axios/issues/191#issuecomment-311069164
Frosty Z


5

それでも解決できない人のために、この答えは私を助けました。 stackoverflow回答:34558264

TLDR; {withCredentials: true}GETリクエストとPOSTリクエスト(Cookieを取得)の両方でaxiosとフェッチの両方を設定する必要があります。


1
これは非常に重要です。私はコードでこれを見落としていて{ withCredentials: true }、GETリクエストで何の効果もないのか疑問に思ってかなりの時間を費やしました。
yogmk

1
とっても大事!withCredentials: trueリクエスト設定への追加については多くの議論がありますが、この詳細については触れていません。この問題に遭遇するまで、私は問題を解決するためにほぼ2日間を費やしました
R. Antao

4

AxiosにリクエストでCookieを自動的に送信させるにはどうすればよいですか?

セットする axios.defaults.withCredentials = true;

または使用できる特定のリクエスト axios.get(url,{withCredentials:true})

'Access-Control-Allow-Origin'がwildcard(*)に設定されている場合、これによりCORSエラーが発生します。したがって、リクエスト元のURLを必ず指定してください

例:リクエストを行うフロントエンドがlocalhost:3000で実行される場合、応答ヘッダーを次のように設定します

res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');

またセット

res.setHeader('Access-Control-Allow-Credentials',true);

3

withCredentialsプロパティを使用して、リクエストでCookieを渡すことができます。

axios.get(`api_url`, { withCredentials: true })

設定{ withCredentials: true }すると、クロスオリジンの問題が発生する可能性があります。それを解決するには、使用する必要があります

expressApp.use(cors({ credentials: true, origin: "http://localhost:8080" }));

ここでwithCredentialsについて読むことができます


2

あなたは二つの考えが混じり合っています。

「react-cookie」と「axios」があります

react-cookie =>はクライアント側でcookieを処理するためのものです

axios =>はajaxリクエストをサーバーに送信するためのものです

その情報を使用して、クライアント側からのCookieがバックエンド側でも通信されるようにするには、それらを一緒に接続する必要があります。

「react-cookie」Readmeからのメモ:

同形のクッキー!

サーバーレンダリングの実行中にユーザーCookieにアクセスできるようにするには、plugToRequestまたはsetRawCookieを使用できます。

Readmeへのリンク

これがあなたが必要とするものなら、素晴らしいです。

そうでない場合は、コメントしてください。詳しく説明します。


plugToRequest正確には何をしますか?ノードサーバーのCookieにアクセスするつもりcookie-parserでしたが、必要なのはミドルウェア(Expressを想定)だけです。
ジオボーイ

2

だから私はこれとまったく同じ問題を抱えており、私の人生の検索の約6時間を失いました。

withCredentials: true

しかし、なんらかの奇妙な理由で構成設定をシャッフルする考えが出るまで、ブラウザーはまだcookieを保存しませんでした。

Axios.post(GlobalVariables.API_URL + 'api/login', {
        email,
        password,
        honeyPot
    }, {
        withCredentials: true,
        headers: {'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json'
    }});

常に最初に「withCredentials」キーを送信する必要があるようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.