問題
Django REST Framework を使って API を作成中、Javascript から POST または DELETE リクエストを送ろうとした結果「POST(リクエスト先 URL) 403 (Forbidden)」のエラー表示。
*DELETE の場合も同じエラーが出ます。
原因
CRSF (Cross Site Request Forgery) に対するセキュリティが働いて、リクエストが拒否されている様子。
解決法
ブラウザのクッキーから CSRF Token を取って、POST リクエストのヘッダーに含めたら解決しました。
元々↓だったところに…
const fetchOptions = { method: 'POST' } fetch('http://example.com/exampleapi',fetchOptions)
クッキーから csfrtoken を抽出して headers に含めて POST リクエストをする様にしました。
function getCookie(name) { let cookieValue = null; if (document.cookie && document.cookie !== '') { const cookies = document.cookie.split(';'); for (let i = 0; i < cookies.length; i++) { const cookie = cookies[i].trim(); if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } const fetchOptions = { method: 'POST', headers:{"X-CSRFToken": getCookie('csrftoken')} } fetch('http://example.com/exampleapi',fetchOptions)
これで一応 POST リクエストが通る様になりました。(HTTP Status 200 が返ってきました。)
DELETE の場合も同じ方法で解決しました。