ActionController :: InvalidAuthenticityToken

Di seguito è riportato un errore, causato da un modulo nella mia applicazione Rails:

Processing UsersController#update (for **ip** at 2010-07-29 10:52:27) [PUT] Parameters: {"commit"=>"Update", "action"=>"update", "_method"=>"put", "authenticity_token"=>"ysiDvO5s7qhJQrnlSR2+f8jF1gxdB7T9I2ydxpRlSSk=", **more parameters**} ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken): 

Ciò accade per ogni richiesta non richiesta e, come vedi, authenticity_token è presente.

Ho avuto lo stesso problema ma con pagine che sono state messe nella cache della pagina. Le pagine sono state archiviate con un token di autenticità scaduto e tutte le azioni che utilizzano i metodi post / put / delete sono riconosciuti come tentativi di contraffazione. Errore (422 Unprocessable Entity) è stato restituito all’utente.

La soluzione:
Inserisci:

  skip_before_filter :verify_authenticity_token 

o come “sagivo” evidenziato in Rails 4 aggiungere:

  skip_before_action :verify_authenticity_token 

Sulle pagine che fanno il caching.

Come ha commentato @toobulkeh, questa non è una vulnerabilità su :index ,: :show actions, ma attenzione ad usarlo su :put ,: :post actions.

Per esempio:

  caches_page :index, :show skip_before_filter :verify_authenticity_token, :only => [:index, :show] 

Riferimento: http://api.rubyonrails.org/classs/ActionController/RequestForgeryProtection/ClassMethods.html

Per me la causa di questo problema sotto Rails 4 era una mancanza,

 <%= csrf_meta_tags %> 

Linea nel mio layout di applicazione principale. L’ho cancellato accidentalmente quando ho riscritto il mio layout.

Se questo non è nel layout principale, sarà necessario in qualsiasi pagina in cui desideri un token CSRF.

Ci sono diverse cause per questo errore, (relativo a Rails 4).

1. Controllare <%= csrf_meta_tags %> presente nel layout di pagina

2. controllare che il token di autenticazione venga inviato con chiamate AJAX se si utilizza form_for helper con remote: true option.Se non si può includere la riga <%= hidden_field_tag :authenticity_token, form_authenticity_token %> il blocco del modulo.

3. Se la richiesta viene inviata dalla pagina cache, utilizzare la memorizzazione nella cache dei frammenti per escludere parte della pagina che invia la richiesta, ad es. button_to ecc. Altrimenti il ​​token sarà non valido / non valido.

Sarei riluttante ad annullare la protezione CSRF …

Il token di autenticità è un valore casuale generato nella tua vista per dimostrare che una richiesta viene inviata da un modulo sul tuo sito, non da un’altra parte. Questo protegge dagli attacchi CSRF:

http://en.wikipedia.org/wiki/Cross-site_request_forgery

Controlla per vedere chi sia quel client / IP, sembra che stia usando il tuo sito senza caricare le tue visualizzazioni.

Se hai bisogno di eseguire il debug di più, questa domanda è un buon punto di partenza: Comprensione del token di autenticità di Rails

Modificato per spiegare: significa che stanno chiamando l’azione per elaborare il modulo di invio senza mai rendere il modulo sul tuo sito web. Ciò potrebbe essere dannoso (ad esempio postare commenti spam) o potrebbe indicare un cliente che tenta di utilizzare direttamente l’API del servizio web. Sei l’unico a poter rispondere in base alla natura del tuo prodotto e ad analizzare le tue richieste.

Aggiungendo semplicemente authenticity_token in forma è stato risolto per me.

 <%= hidden_field_tag :authenticity_token, form_authenticity_token %> 

troppo tardi per rispondere ma ho trovato la soluzione.

Quando si definisce il proprio modulo html, si perde la stringa del token di autenticazione che deve essere inviata al controller per motivi di sicurezza. Ma quando usi l’aiuto dei binari per generare un modulo ottieni qualcosa come il seguente

 
. . .

Pertanto, la soluzione al problema consiste nell’aggiungere il campo autenticità_token o utilizzare le guide dei moduli di rotaia piuttosto che rimuovere, eseguire il downgrade o aggiornare i binari.

Se hai eseguito un rake rails:update o, in caso contrario, di recente modificato la tua config/initializers/session_store.rb , questo potrebbe essere un sintomo di vecchi cookie nel browser. Spero che ciò avvenga in dev / test (era per me), e puoi semplicemente cancellare tutti i cookie del browser relativi al dominio in questione.

Se questo è in produzione, e hai cambiato key , prova a cambiarla per usare i vecchi cookie (<- solo speculazione).

Ho avuto questo problema con le chiamate javascript. Ho risolto questo problema richiedendo solo jquery_ujs nel file application.js.

Per le rotaie 5, è meglio aggiungere protect_from_forgery prepend: true piuttosto che saltare verify_authentication_token

ActionController::InvalidAuthenticityToken può anche essere causato da un proxy inverso non configurato ActionController::InvalidAuthenticityToken . Questo è il caso se nella traccia dello stack, si ottiene una riga simile a Request origin does not match request base_url .

Quando si utilizza un proxy inverso (come nginx) come ricevitore per la richiesta HTTPS e la trasmissione della richiesta non crittografata al back-end (come l’app Rails), il back-end (in particolare: Rack) prevede alcune intestazioni con ulteriori informazioni sulla richiesta del client originale per poter applicare varie attività di elaborazione e misure di sicurezza.

Maggiori dettagli sono disponibili qui: https://github.com/rails/rails/issues/22965 .

TL; DR: la soluzione è aggiungere alcune intestazioni:

 upstream myapp { server unix:///path/to/puma.sock; } ... location / { proxy_pass http://myapp; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Ssl on; # Optional proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-Host $host; } 

Abbiamo avuto lo stesso problema, ma abbiamo notato che era solo per le richieste che utilizzavano http: // e non con https: //. La causa era secure: true per session_store:

 Rails.application.config.session_store( :cookie_store, key: '_foo_session', domain: '.example.com', secure: true ) 

Risolto utilizzando HTTPS ~ ovunque 🙂

Forse hai la tua configurazione NGINX per HTTPS ma i tuoi certificati non sono validi? Ho avuto un problema simile in passato e il reindirizzamento da http a https ha risolto il problema

Ho avuto questo problema e il motivo era perché ho copiato e incollato un controller nella mia app. Avevo bisogno di cambiare ApplicationController in ApplicationController::Base

Installazione

 gem 'remotipart' 

può aiutare

Ho avuto lo stesso problema su localhost. Ho cambiato il dominio per l’app, ma nel file degli URL e degli host c’era ancora il vecchio dominio. Aggiornato i miei segnalibri del browser e il file hosts per utilizzare il nuovo dominio e ora tutto funziona correttamente.

Ho controllato che <% = csrf_meta_tags%> sia presente e che i cookie di cancellazione nel browser funzionino per me.

Problema risolto effettuando il downgrade a 2.3.5 da 2.3.8. (così come il famigerato problema “Stai per essere reindirizzato.”)