2010-02-13 6 views
0

Dans une application je fais, je reçois beaucoup de ces messages:Faire le jeton en direct plus Cross-Site Request Forgery dans Rails

A ActionController::InvalidAuthenticityToken occurred in items#vote_up: 
    ActionController::InvalidAuthenticityToken 
    /var/lib/gems/1.8/gems/actionpack-2.3.4/lib/action_controller/request_forgery_protection.rb:79:in `verify_authenticity_token' 

que je pense que ça se passe parce que les gens passent beaucoup de temps sur cette page sans jamais le rafraîchir (il utilise ajax) et les jetons expirent.

Y a-t-il un moyen de prolonger la vie de ces tokens?

Répondre

2

Il n'y a aucune raison qu'une limite de temps entraîne cette exception. L'exception ActionController::InvalidAuthenticityToken est provoquée lorsque le jeton de protection de contrefaçon reçu dans la demande est différent de ce qu'il devrait être.

Voici un code que vous pouvez ajouter à votre code JavaScript pour ajouter dans le jeton de protection contre la falsification correcte:

$.ajax({ 
    url: url, 
    data: { 
    authenticity_token: <%= form_authenticity_token.to_json %>, 
    ... 
    } 
}); 

De cette façon, votre jeton sera correcte.

+0

Les jetons vivent-ils pour toujours? Sinon, combien de temps vivent-ils? Où proposez-vous que je devrais ajouter cela (je ne pense pas avoir une seule ligne de JavaScript dans l'ensemble du projet). – Pablo

+0

Vous avez dit que la demande était sur AJAX? Sinon, les aides de formulaire dans Rails placent automatiquement le jeton d'authenticité correct pour vous. –

+0

Josh, c'est sur AJAX, mais en utilisant les helpers de Rails, il a donc le bon jeton. Sinon, il échouerait toujours, pas une fois sur cent. – Pablo