ruby-on-rails - software - ruby on rails tutorial
ActionController::InvalidAuthenticityToken (16)
¿Tal vez tiene su configuración de NGINX para HTTPS, pero sus certificados no son válidos? He tenido un problema similar en el pasado y la redirección de http a https resolvió el problema
A continuación se muestra un error causado por un formulario en mi aplicación 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):
Esto sucede para cada solicitud no solicitada y, como puede ver, authenticity_token
está ahí.
El token de autenticidad es un valor aleatorio generado en su vista para demostrar que una solicitud se envía desde un formulario en su sitio, no en otro lugar. Esto protege contra los ataques de CSRF:
http://en.wikipedia.org/wiki/Cross-site_request_forgery
Compruebe para ver quién es ese cliente / IP, parece que está utilizando su sitio sin cargar sus vistas.
Si necesita seguir depurando, esta pregunta es un buen lugar para comenzar: comprender el token de autenticidad de Rails
Editado para explicar: Significa que están convocando la acción para procesar el envío de su formulario sin siquiera presentar su formulario en su sitio web. Esto podría ser malicioso (por ejemplo, publicar comentarios de spam) o podría indicar que un cliente intenta usar su API de servicio web directamente. Usted es el único que puede responder por la naturaleza de su producto y analizar sus solicitudes.
Hay varias causas para este error (relacionado con Rails 4).
1. Compruebe <%= csrf_meta_tags %>
presente en el diseño de la página
2. Comprobar que el token de autenticidad se está enviando con llamadas AJAX si se usa form_for
helper con remote: true
opción remote: true
Si no, puede incluir la línea <%= hidden_field_tag :authenticity_token, form_authenticity_token %>
withing the form block.
3. Si la solicitud se envía desde la página almacenada en caché, utilice el almacenamiento en memoria caché de fragmentos para excluir parte de la página que envía la solicitud, por ejemplo, button_to
etc. De lo contrario, token quedará obsoleto / no válido.
Sería reacio a anular la protección csrf ...
He usado algo así y me funciona.
class WelcomeController < ActionController::Base
protect_from_forgery with: :exception
before_action :authenticate_model!
end
Instalación
gem ''remotipart''
poder ayudar
Para los rieles 5, es mejor agregar protect_from_forgery prepend: true
que omitir verify_authentication_token
Para mí, la causa de este problema en Rails 4 era una falta,
<%= csrf_meta_tags %>
Línea en el diseño de mi aplicación principal. Lo borré accidentalmente cuando reescribí mi diseño.
Si esto no está en el diseño principal, lo necesitará en cualquier página en la que desee un token CSRF.
Problema resuelto por degradación a 2.3.5 desde 2.3.8. (así como el infame problema ''Estás siendo redirigido'')
Si ha realizado un rake rails:update
o haya cambiado recientemente su config/initializers/session_store.rb
, esto puede ser un síntoma de cookies antiguas en el navegador. Espero que esto se haga en dev / test (fue para mí), y puedes borrar todas las cookies del navegador relacionadas con el dominio en cuestión.
Si esto está en producción y cambiaste la key
, considera cambiarla para usar las cookies antiguas (<- solo especulación).
Solo agregué el authenticity_token
en forma para solucionarlo.
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
Tuve el mismo problema en localhost. Cambié el dominio de la aplicación, pero en las URL y en el archivo de hosts todavía existía el dominio anterior. Actualicé los marcadores de mi navegador y el archivo de hosts para usar el nuevo dominio y ahora todo funciona bien.
Tuve el mismo problema pero con páginas que fueron almacenadas en la página. Las páginas se almacenaron en búfer con un token de autenticidad obsoleto y todas las acciones que utilizan los métodos post / put / delete donde se reconocen como intentos de falsificación. Error (422 Entidad no procesable) fue devuelto al usuario.
La solución:
Añadir:
skip_before_filter :verify_authenticity_token
o como "sagivo" señalado en Rails 4 agregar:
skip_before_action :verify_authenticity_token
En las páginas que hacen el almacenamiento en caché.
Como @toobulkeh comentó que esto no es una vulnerabilidad en :index
,: :show
actions, pero ten cuidado al usar esto en :put
,: :post
actions.
Por ejemplo:
caches_page :index, :show
skip_before_filter :verify_authenticity_token, :only => [:index, :show]
Referencia: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html
Tuve este problema con las llamadas de JavaScript. Lo arreglé con solo requerir jquery_ujs en el archivo application.js.
Tuve este problema y la razón fue porque copié y pegué un controlador en mi aplicación. Necesitaba cambiar ApplicationController
a ApplicationController::Base
Tuvimos el mismo problema, pero notamos que solo era para solicitudes que usaban http: // y no con https: //. La causa fue secure: true
para session_store:
Rails.application.config.session_store(
:cookie_store,
key: ''_foo_session'',
domain: ''.example.com'',
secure: true
)
Solucionado mediante el uso de HTTPS ~ en todas partes :)
demasiado tarde para responder, pero encontré la solución.
Cuando define su propio formulario html, pierde la cadena de token de autenticación que debe enviarse al controlador por razones de seguridad. Pero cuando usas rails from helper para generar un formulario obtienes algo así como lo siguiente
<form accept-charset="UTF-8" action="/login/signin" method="post">
<div style="display:none">
<input name="utf8" type="hidden" value="✓">
<input name="authenticity_token" type="hidden"
value="x37DrAAwyIIb7s+w2+AdoCR8cAJIpQhIetKRrPgG5VA=">
.
.
.
</div>
</form>
Por lo tanto, la solución al problema es agregar el campo authenticity_token o usar los rails como ayudantes en lugar de eliminar, degradar o actualizar los rieles.