Estou enviando dados do modo de exibição para o controlador com AJAX e recebi este erro:
AVISO: Não é possível verificar a autenticidade do token CSRF
Eu acho que tenho que enviar esse token com dados.
Alguém sabe como posso fazer isso?
Edit: Minha solução
Eu fiz isso colocando o seguinte código dentro da postagem do AJAX:
headers: {
'X-Transaction': 'POST Example',
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},
ruby-on-rails
jquery
csrf
kbaccouche
fonte
fonte
Respostas:
Você deve fazer isso:
Verifique se você tem
<%= csrf_meta_tag %>
em seu layoutAdicione
beforeSend
a toda a solicitação ajax para definir o cabeçalho como abaixo:Para enviar token em todas as solicitações, você pode usar:
fonte
A melhor maneira de fazer isso é usar apenas
<%= form_authenticity_token.to_s %>
para imprimir o token diretamente no seu código rails. Você não precisa usar o javascript para pesquisar o dom pelo token csrf, como outros posts mencionam. basta adicionar a opção de cabeçalhos como abaixo;fonte
Se bem me lembro, você deve adicionar o seguinte código ao seu formulário, para se livrar desse problema:
Não esqueça o parâmetro.
fonte
<%= token_tag(nil) %>
. Então você obtém o token gerado automaticamente.De fato, a maneira mais simples. Não se preocupe em alterar os cabeçalhos.
Assegure-se de ter:
Basta fazer um campo de entrada oculto da seguinte maneira:
Ou, se você quiser uma postagem do jQuery ajax:
fonte
A atualização de um aplicativo mais antigo para o Rails 3.1, incluindo a metatag csrf ainda não está resolvendo isso. No blog rubyonrails.org, eles fornecem algumas dicas de atualização e, especificamente, esta linha de jquery, que deve estar na seção principal do seu layout:
extraído desta postagem do blog: http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails .
No meu caso, a sessão estava sendo redefinida a cada solicitação de ajax. A adição do código acima resolveu esse problema.
fonte
<%= csrf_meta_tag %>
em seu layoutbeforeSend
para incluir o token csrf na solicitação ajax para definir o cabeçalho. Isso é necessário apenas parapost
solicitações.O código para ler o csrf-token está disponível no diretório
rails/jquery-ujs
, portanto, é mais fácil usá-lo da seguinte maneira:fonte
headers: { 'X-CSRF-Token': Rails.csrfToken() }
Eu apenas pensei em vincular isso aqui, pois o artigo tem a maioria das respostas que você está procurando e também é muito interessante
http://www.kalzumeus.com/2011/11/17/i-saw-an-extremely-subtle-bug-today-and-i-justjust-have-to-tell-someone/
fonte
As principais respostas votadas aqui estão corretas, mas não funcionarão se você estiver executando solicitações entre domínios, porque a sessão não estará disponível, a menos que você diga explicitamente ao jQuery para passar o cookie da sessão. Veja como fazer isso:
fonte
Você pode escrevê-lo globalmente como abaixo.
JS normal:
Script Café:
fonte
oops ..
Eu perdi a seguinte linha no meu application.js
Eu o substituí e está funcionando ..
======= ATUALIZADO =========
Após 5 anos, estou de volta com o mesmo erro, agora tenho o Rails 5.1.6 totalmente novo e encontrei este post novamente. Assim como o círculo da vida.
Agora, qual era o problema: o Rails 5.1 removeu o suporte para jquery e jquery_ujs por padrão e adicionou
Faz o seguinte:
Mas por que não está incluindo o token csrf para solicitação de ajax? Se alguém souber sobre isso em detalhes, basta comentar-me. Obrigado.
De qualquer forma, adicionei o seguinte no meu arquivo js personalizado para fazê-lo funcionar (obrigado por outras respostas para me ajudar a alcançar esse código):
fonte
jquery_ujs
. Esse foi o truque.Se você não estiver usando jQuery e usando algo como buscar API para solicitações, poderá usar o seguinte para obter
csrf-token
:document.querySelector('meta[name="csrf-token"]').getAttribute('content')
fonte
Use jquery.csrf ( https://github.com/swordray/jquery.csrf ).
Rails 5.1 ou posterior
Rails 5.0 ou anterior
Código fonte
fonte
//= require jquery.csrf
não vai funcionar, certo ?. Em vez disso, usei o pacote js fileimport 'jquery.csrf'
nele. Observe que você não precisa incluir isso com uma tag de pacote em suas visualizações.Se você estiver usando javascript com jQuery para gerar o token no seu formulário, isso funcionará:
Obviamente, você precisa ter o
<%= csrf_meta_tag %>
no seu layout Ruby.fonte
Para aqueles que precisam de uma resposta que não seja do jQuery, basta adicionar o seguinte:
Um exemplo muito simples pode ser usado aqui:
fonte
Eu lutei com esse problema por dias. Qualquer chamada GET estava funcionando corretamente, mas todas as PUTs gerariam um erro "Não é possível verificar a autenticidade do token CSRF". Meu site estava funcionando bem até eu adicionar um certificado SSL ao nginx.
Eu finalmente tropecei nessa linha ausente nas minhas configurações de nginx:
Após adicionar a linha ausente "proxy_set_header X-Forwarded-Proto https;", todos os meus erros de token CSRF são encerrados.
Espero que isso ajude alguém que também está batendo a cabeça contra uma parede. haha
fonte
se alguém precisar de ajuda relacionada ao Uploadify e Rails 3.2 (como eu quando pesquisei este post no Google), este exemplo de aplicativo pode ser útil: https://github.com/n0ne/Uploadify-Carrierwave-Rails-3.2.3/blob/master /app/views/pictures/index.html.erb
verifique também a solução do controlador neste aplicativo
fonte
Estou usando o Rails 4.2.4 e não consegui entender por que estava recebendo:
Eu tenho no layout:
No controlador:
A chamada
tcpdump -A -s 999 -i lo port 3000
estava mostrando o cabeçalho sendo definido (apesar de não ser necessário definir os cabeçalhos comajaxSetup
- já foi feito):No final, estava falhando porque eu tinha os cookies desligados. O CSRF não funciona sem que os cookies sejam ativados, portanto, essa é outra causa possível se você estiver vendo esse erro.
fonte