Ricevo un errore di token CSRF non valido durante il tentativo di aggiornare (o creare) un record. Sto usando Elixir v1.0.3, Erlang/OTP 17 [erts-6.3] e Phoenix v0.8.0 (penso, non sono sicuro di come controllare la versione di Phoenix). Sto creando un'app Web che segue principalmente le guide di Phoenix e le risorse di esempio del sito di vendita di elisir. Tuttavia, quando provo a pubblicare informazioni da un modulo html, ottengo l'errore del token CSRF non valido. Seguendo il consiglio dato nell'errore, ho aggiunto "x-csrf-token": csrf_token all'azione.Phoenix - Errore token CSRF (Cross Site Forgery Protection) non valido
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>
...
ma ricevo il seguente errore:
[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
Per quanto posso dire (essendo nuovo a Elixir, Phoenix, e HTML), " azione "è essenzialmente un percorso e tutti i parametri che inserisco troveranno la via per tornare all'applicazione. E, in effetti, trovo che x-csrf-token = "" è passato al router, quindi @csrf_token non deve essere corretto. Non sono sicuro esattamente da dove viene il csrf_token, quindi non so come fare riferimento (o forse sto facendo questo completamente sbagliato).
Qualsiasi idea sarebbe molto apprezzata.
Grazie per la risposta dettagliata. Si scopre che sto eseguendo Phoenix 0.8.0, quindi il codice sotto funziona, ma mi hai salvato un grosso mal di testa quando eseguo l'aggiornamento a 0.9.0! –
Grazie ancora @ a4word, ho eseguito l'aggiornamento a Phoenix 0.9.0 e ho modificato il modello per ottenere il token dal cookie. Tuttavia, stranamente, sembra funzionare, ma sto ancora ricevendo un errore di token CSRF (Cross Site Forgery Protection) non valido. Il token è 'ne0GATpoc/EW6jbIbC7tmfkAWl4qb1opTPWmmfYFTRY =' (senza spazi) e il template crea un url 'POST/config/directory/9? X-csrf-token = ne0GATpoc% 2FEW6jbIbC7tmfkAWl4qb1opTPWmmfYFTRY% 3D' Non ho idea del perché Plug.CSRFProtection non mi piace. Sai o dovrei aprire un'altra domanda? –
Ho cambiato il nome del token nel modello da: ''x-csrf-token': Map.get (@ conn.req_cookies," _csrf_token ")' a: ''_csrf_token': Map.get (@ conn.req_cookies , "_csrf_token") e ora funziona –