3 votes

Devise : comment puis-je définir manuellement un cookie remember_user_token ?

J'utilise devise 1.1.RC0 pour l'authentification des utilisateurs dans une application rails 3.0.0.

En raison d'un problème avec cette version de devise, et du fait que notre processus de connexion se déroule sur un sous-domaine (sécurisé), lorsqu'un utilisateur se connecte, la balise remember_user_token le cookie n'est pas placé. Cela ne se produit qu'en production lorsque des sous-domaines sont impliqués : l'application définira correctement un cookie de type remember_user_token lors des tests locaux.

Pour contourner ce problème, j'ai ajusté mes user_sessions#create pour définir cette remember_user_token manuellement :

  def create
    user = User.where("lower(email) = ?", params[:user][:email].downcase).first
    if user and user.valid_password?(params[:user][:password])
      sign_in(:user, user)
      current_user.remember_me = true if params[:user][:remember_me]

      #ensure remember_user_token is set
      if Rails.env.production?
        cookies.signed["remember_user_token"] = {
          :value => user.class.serialize_into_cookie(user),
          :expires => 3.months.from_now,
          :domain => ".app_name.com",
        }
      end

    else
      flash[:error] = "Login incorrect"
      render :action => 'new'
    end
  end 

Cela établit une remember_user_token cookie en production. À partir de là, si je supprime le cookie de session à l'aide des outils du navigateur et que je rafraîchis ensuite la page, le cookie de session réapparaît et je reste connecté - ce qui, je suppose, est le but de l'opération. remember_user_token cookie est responsable.

Toutefois, si je ferme le navigateur et redémarre mon ordinateur alors que je suis connecté, je ne suis plus connecté lorsque je rallume mon ordinateur et que j'accède à l'URL de mon application.

Quelle est la façon correcte de régler cette remember_user_token cookie ? Qu'est-ce que j'ai raté ? J'apprécierais toute aide.

Voici mon session_store initialisateur :

if Rails.env.production?
  AppName::Application.config.session_store :cookie_store, :key => '_app_name_session', :domain => '.appname.com'
else
  AppName::Application.config.session_store :cookie_store, :key => '_app_name_session'
end

Voici le code correspondant dans mon User modèle :

  devise :database_authenticatable, :registerable, 
         :recoverable, :rememberable, :trackable, :validatable

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