前提
クライアントサイドにNext.js、APIサーバーにDjangoを使用しています。
Next.js: 127.0.0.1:3000
Django: 127.0.0.1:8000
発生している問題
クライアントからAPIにaxiosを用いてGETリクエストを送る際、cookieが付与されない。
このcookieはAPIサーバーによってセットされたものでhttpOnlyとしてブラウザに保存されています。
該当のソースコード
下記のようにGETリクエストを投げます。
const auth = axios.create({ baseURL: 'http://127.0.0.1:8000/api/v1/auth', headers: { 'Content-Type': 'application/json' }, withCredentials: true }) const { data } = await auth.get('/test/')
一方リクエストを受け取るAPIの設定は以下の通りです。
CORS_ORIGIN_ALLOW_ALL = False CORS_ORIGIN_WHITELIST = ( '127.0.0.1:3000' ) CORS_ALLOW_CREDENTIALS = True
試したこと
まずAPIサーバーがリクエストを受信できているのかということを確認するために
const { data } = await auth.get('/user/', { headers: { Cookie: `token=${token}` } })---
ブラウザにあるcookie storage内のtokenを取得後、ヘッダーに手動でのせてリクエストを送信したところ、API側でrequest.COOKIES
に入っているのが確認できました。
また念の為、Postmanを用いてNext.jsを介さずにAPIにリクエストしたところAPIでcookieを取得できていました。ちなみにこのときは手動でヘッダータブからCookie項目を追加してcookieの追加を行ったのではなく、すでにセットされてあるcookieを使用して行いました。
axiosの設定に問題があるのかと思いましたが、調べて出てきたwithCredentialsの設定やaxiosではなくfetch、isomorphic-fetch、isomorphic-unfetchそれぞれのfetchを試してみましたがだめでした。
chromeのnetworkタブでGETリクエストした際の結果がこちらです。
タイトルはcookieが送信されない、となってますがこの画像を見る限りCookie: token=52e...
となっているので送信はされていると考えてます。
追記:
PostmanとaxiosのそれぞれでGETリクエストを送信し、django側でrequest.METAに入っていたものを比較してみました。以下抜粋ですが、やはりaxiosの場合はcookieの項目がありませんでした。
Postman 'HTTP_CACHE_CONTROL': 'no-cache', 'HTTP_POSTMAN_TOKEN': '9077175d-4da7-4196-b2c6-3ef0b04568f9', 'HTTP_USER_AGENT': 'PostmanRuntime/7.6.0', 'HTTP_ACCEPT': '*/*', 'HTTP_HOST': '127.0.0.1:8000', 'HTTP_COOKIE': 'token=179780f7ca388ae1dec47f5dee717a4b7cb5848e0c21b68b2a5715e62115570b', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 'HTTP_CONNECTION': 'keep-alive' axios 'HTTP_ACCEPT': 'application/json, text/plain, */*', 'HTTP_USER_AGENT': 'axios/0.18.0', 'HTTP_HOST': '127.0.0.1:8000', 'HTTP_CONNECTION': 'close'
あなたの回答
tips
プレビュー