Eu estava trabalhando em um novo aplicativo Rails 4 (no Ruby 2.0.0-p0) quando me deparei com alguns problemas de token de autenticidade.
Ao escrever um controlador que responde ao json (usando o respond_to
método de classe), cheguei à create
ação que comecei a receber ActionController::InvalidAuthenticityToken
exceções quando tentei criar um registro usando curl
.
Eu fiz questão de definir -H "Content-Type: application/json"
e definir os dados com, -d "<my data here>"
mas ainda sem sorte.
Tentei escrever o mesmo controlador usando o Rails 3.2 (no Ruby 1.9.3) e não tive nenhum problema de token de autenticidade. Pesquisei e vi que havia algumas alterações nos tokens de autenticidade no Rails 4. Pelo que entendi, eles não são mais inseridos automaticamente nos formulários? Suponho que isso esteja afetando de alguma forma os tipos de conteúdo não HTML.
Existe alguma maneira de contornar isso sem precisar solicitar um formulário HTML, capturando o token de autenticidade e fazendo outra solicitação com esse token? Ou estou perdendo completamente algo que é completamente óbvio?
Edit: Eu apenas tentei criar um novo registro em um novo aplicativo Rails 4 usando um andaime sem alterar nada e estou tendo o mesmo problema, então acho que não foi algo que fiz.
before_action
que verifica o formato e se a solicitação foi verificada. Não conheço nenhuma forma construída para definir condições.skip_before_action :verify_authenticity_token
no controlador de aplicativos da minha API para fazer isso funcionar.:verify_authenticy_token
mais desativar o Rails 4.2. O padrão é:null_session
que, como o nome indica, apenas fornece uma solicitação sem uma sessão. Você pode verificar a solicitação por meio de uma chave de API.Em vez de desativar a proteção csrf, é melhor adicionar a seguinte linha de código no formulário
e se você estiver usando form_for ou form_tag para gerar o formulário, ele adicionará automaticamente a linha de código acima no formulário
fonte
Adicionar a seguinte linha ao formulário funcionou para mim:
fonte
=token_tag nil
ou (em .erb)<%= token_tag nil %>
Não acho que seja bom desativar a proteção contra CSRF, desde que você não implemente exclusivamente uma API.
Ao examinar a documentação da API do Rails 4 para o ActionController , descobri que você pode desativar a proteção contra falsificação em uma base por controlador ou por método.
Por exemplo, para desativar a proteção CSRF para métodos que você pode usar
fonte
Me deparei com o mesmo problema. Corrigido adicionando ao meu controlador:
fonte
Você tentou?
fonte
Este documento oficial - fala sobre como desativar a proteção contra falsificação de API corretamente http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html
fonte
Este é um recurso de segurança no Rails. Adicione esta linha de código no formulário:
A documentação pode ser encontrada aqui: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html
fonte
Esses recursos foram adicionados para fins de segurança e proteção contra falsificação.
No entanto, para responder à sua pergunta, aqui estão algumas entradas. Você pode adicionar essas linhas após o nome do controlador.
Igual a,
Aqui estão algumas linhas para diferentes versões de trilhos.
Trilhos 3
Trilhos 4 :
Caso pretenda desativar esse recurso de segurança para todas as rotinas do controlador, você pode alterar o valor de protect_from_forgery para : null_session no arquivo application_controller.rb.
Igual a,
fonte
Se você estiver usando o jQuery com trilhos, tenha cuidado ao permitir a entrada de métodos sem verificar o token de autenticidade.
jquery-ujs pode gerenciar os tokens para você
Você já deve tê-lo como parte da gema jquery-rails, mas pode ser necessário incluí-lo no application.js com
É tudo o que você precisa - sua chamada ajax agora deve funcionar
Para mais informações, consulte: https://github.com/rails/jquery-ujs
fonte
Adicionar
authenticity_token: true
à tag do formuláriofonte
Ao definir seu próprio formulário html, é necessário incluir a sequência do token de autenticação, que deve ser enviada ao controlador por motivos de segurança. Se você usar o auxiliar de formulário do rails para gerar o token de autenticidade, ele será adicionado ao formulário da seguinte forma.
Portanto, a solução para o problema é adicionar o campo authenticity_token ou usar auxiliares de formulário de trilhos, em vez de comprometer a segurança etc.
fonte
application/json
.Todos os meus testes estavam funcionando bem. Mas, por algum motivo, eu havia definido minha variável de ambiente como não teste:
Esqueci de desmarcar essa variável por causa da qual comecei a receber
ActionController::InvalidAuthenticityToken
exceção.Após desarmar
$RAILS_ENV
, meus testes começaram a funcionar novamente.fonte