मुझे रिकॉर्ड (या बनाने) को अपडेट करने का प्रयास करते समय एक अमान्य सीएसआरएफ टोकन त्रुटि प्राप्त हो रही है। मैं Elixir v1.0.3, Erlang/OTP 17 [erts-6.3], और फीनिक्स v0.8.0 का उपयोग कर रहा हूं (मुझे लगता है, मुझे यकीन नहीं है कि फीनिक्स के संस्करण को कैसे जांचें)। मैं ज्यादातर फीनिक्स गाइड और एलिक्सीर डोस जॉब्ससाइट उदाहरण संसाधनों के बाद एक वेब ऐप बना रहा हूं। हालांकि, जब मैं एक HTML फॉर्म से जानकारी पोस्ट करने का प्रयास करता हूं, तो मुझे अमान्य सीएसआरएफ टोकन त्रुटि मिलती है। त्रुटि में दी गई सलाह के बाद, मैंने 'x-csrf-token' जोड़ा: कार्रवाई के लिए csrf_token।फीनिक्स - अमान्य सीएसआरएफ (क्रॉस साइट फोर्जरी प्रोटेक्शन) टोकन त्रुटि
edit.html.eex:
<h2>Edit Directory</h2>
<form class="form-horizontal" action="<%= directory_path @conn, :update, @directory.id, 'x-csrf-token': @csrf_token %>" method="post">
<div class="form-group">
<label for="directory" class="col-sm-2 control-label">Directory</label>
<div class="col-sm-10">
<input type="hidden" name="_method" value="PATCH">
<input type="text" class="form-control" value="<%= @directory.directory %>" name="directory" placeholder="Directory" required="required">
</div>
</div>
...
लेकिन मैं निम्न त्रुटि प्राप्त: जहां तक मेरा बता सकते हैं (अमृत, फीनिक्स, और HTML के लिए नया किया जा रहा है)
[error] #PID<0.579.0> running Ainur.Endpoint terminated
Server: localhost:4000 (http)
Request: POST /config/directories/2?x-csrf-token=
** (exit) an exception was raised:
** (Plug.CSRFProtection.InvalidCSRFTokenError) Invalid CSRF (Cross Site Forgery Protection) token. Make sure that all your non-HEAD and non-GET requests include the csrf_token as part of form params or as a value in your request's headers with the key 'x-csrf-token'
(plug) lib/plug/csrf_protection.ex:54: Plug.CSRFProtection.call/2
(ainur) web/router.ex:4: Ainur.Router.browser/2
(ainur) lib/phoenix/router.ex:2: Ainur.Router.call/2
(plug) lib/plug/debugger.ex:104: Plug.Debugger.wrap/3
(phoenix) lib/phoenix/endpoint/error_handler.ex:43: Phoenix.Endpoint.ErrorHandler.wrap/3
(ainur) lib/ainur/endpoint.ex:1: Ainur.Endpoint.phoenix_endpoint_pipeline/2
(plug) lib/plug/debugger.ex:104: Plug.Debugger.wrap/3
(phoenix) lib/phoenix/endpoint/error_handler.ex:43: Phoenix.Endpoint.ErrorHandler.wrap/3
, " कार्रवाई "अनिवार्य रूप से एक पथ है और इसमें जो भी पैरामीटर हैं, वे एप्लिकेशन पर वापस आ जाएंगे। और, वास्तव में, मुझे लगता है कि x-csrf-token = "" राउटर को वापस भेज दिया गया है, इसलिए @csrf_token सही नहीं होना चाहिए। मुझे यकीन नहीं है कि csrf_token कहां से आता है, इसलिए मुझे नहीं पता कि इसका संदर्भ कैसे दिया जाए (या शायद मैं इसे पूरी तरह से गलत कर रहा हूं)।
किसी भी विचार की सराहना की जाएगी।
विस्तृत प्रतिक्रिया के लिए धन्यवाद। यह पता चला है कि मैं फीनिक्स 0.8.0 चला रहा हूं, इसलिए नीचे दिया गया कोड काम करता है, लेकिन जब आप 0.9.0 में अपग्रेड करते हैं तो आपने मुझे एक बड़ा सिरदर्द बचा लिया है! –
धन्यवाद फिर से @ a4word, मैंने फीनिक्स 0.9.0 में अपग्रेड किया और कुकी से टोकन प्राप्त करने के लिए टेम्पलेट को बदल दिया। हालांकि, आश्चर्यजनक रूप से पर्याप्त, ऐसा लगता है, लेकिन मुझे अभी भी एक अवैध सीएसआरएफ (क्रॉस साइट फोर्जरी प्रोटेक्शन) टोकन त्रुटि मिल रही है। टोकन 'ne0GATpoc/EW6jbIbC7tmfkAWl4qb1opTPWmmfYFTRY =' (कोई रिक्त स्थान नहीं है) और टेम्पलेट एक यूआरएल 'POST/config/निर्देशिका/9 बनाता है? X-csrf-token = ne0GATpoc% 2FEW6jbIbC7tmfkAWl4qb1opTPWmmfYFTRY% 3 डी' मुझे नहीं पता कि प्लग.CSRFProtection क्यों नहीं करता है पसंद है। क्या आप जानते हैं या मुझे एक और सवाल खोलना चाहिए? –
मैंने टेम्पलेट में टोकन का नाम बदल दिया: 'x-csrf-token ": Map.get (@ conn.req_cookies," _csrf_token ")' to: '' _csrf_token ': Map.get (@ conn.req_cookies , "_csrf_token") 'और अब यह काम करता है। –