3 votes

Rails - la session ne fonctionne pas pour l'ouverture de session par AJAX ?

J'ai une application Rails qui utilise des pages html statiques (pas dans app/views/) envoyant des requêtes AJAX au serveur rails pour la connexion et la déconnexion.

J'ai utilisé la session pour l'authentification de l'utilisateur et lorsque l'utilisateur se connecte, session[:userid] et la réponse "logged in" est renvoyée à la page html statique. Cependant, après avoir ouvert une session, lorsque je clique sur le bouton de déconnexion, j'ai trouvé le message suivant session[:userid] est devenu nil .

Voici mon code :

Pour se connecter :

  def login
    # code here
    if encrypt(params[:password]) == @user.password # authenticated
      session[:userid] = @user.id
      render :text => 'logged in'
    else # wrong password
      render :text => 'password not correct'
    end
  end

Pour la déconnexion

  def logout
    # here session is no longer available  
    session[:userid] = nil  
    render :text => 'logged out'
  end

Page de connexion :

    <button id='login_button'>Log in</button>
    <script type="text/javascript" charset="utf-8">
        $('#login_button').click(function() {
            $.ajax({
                type: 'POST',
                url: 'http://localhost:3000/user/login',
                data: { username : $('#login_username').val() , password : $('#login_password').val() }
            }).done(function(data) {
                if (data == 'logged in') {
                    window.location = 'logged_in.html';
                } else {
                    alert(data);
                }
            });
        });
    </script>

Et pour la déconnexion :

<button id='logout_button'>Log out</button>
<script type="text/javascript" charset="utf-8">
    $('#logout_button').click(function() {
        $.ajax({
            type: 'POST',
            url: 'http://localhost:3000/user/logout',
        }).done(function(data) {
            console.log(data);
        });
    });
</script>

Log pour la connexion :

Started POST "/user/login" for 127.0.0.1 at 2012-10-12 16:28:46 -0500
Processing by UserController#login as */*
  Parameters: {"username"=>"name", "password"=>"[FILTERED]"}
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE (username = 'name')
Completed 200 OK in 12ms (Views: 0.3ms | ActiveRecord: 0.6ms)

Log pour la déconnexion :

Started POST "/user/logout" for 127.0.0.1 at 2012-10-12 16:28:50 -0500
Processing by UserController#logout as */*
{} <--------------------------------------- here I printed out session
  Rendered text template (0.0ms)
Completed 200 OK in 1ms (Views: 0.7ms | ActiveRecord: 0.0ms)

Est-ce le problème d'AJAX, que nous ne pouvons pas utiliser la session pour les demandes AJAX du client ?

Merci d'avance.

6voto

Max Dunn Points 1204

L'option "protect_from_forgery" est-elle activée ? Si oui, c'est la cause du problème. Lorsque Rails reçoit l'appel Ajax et ne trouve pas le bon jeton CSRF, il ferme la session.

Au lieu de désactiver la protection de manière globale, il serait préférable de la désactiver uniquement pour tous les appels provenant de la page statique en plaçant quelque chose comme ceci dans le contrôleur concerné :

skip_before_filter :verify_authenticity_token, :only => [:login, :logout]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X