3

Rails 3.0.0アプリでユーザー認証にdevise 1.1.RC0を使用しています。

このバージョンのデバイスの問題と、ログイン プロセスが (安全な) サブドメインで行われるという事実により、ユーザーがログインしたときにremember_user_tokenCookie が設定されません。これは、サブドメインが関係する本番環境でのみ発生します。アプリは、remember_user_tokenローカルでテストするときに Cookie を正しく設定します。

この問題を回避するために、これを手動でuser_sessions#create設定するようにアクションを調整しました。remember_user_token

  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 

これによりremember_user_token、本番環境で Cookie が設定されます。そこから、ブラウザー ツールを使用してセッション Cookie を削除してからページを更新すると、セッション Cookie が再び表示され、ログインしたままになりますremember_user_token

ただし、ログイン中にブラウザを閉じてコンピュータを再起動すると、コンピュータの電源を入れ直してアプリの URL にアクセスすると、ログインしていません。

remember_user_tokenこのCookieを設定する正しい方法は何ですか? 私は何が欠けていますか?助けていただければ幸いです。

ここに私のsession_storeイニシャライザがあります:

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

私のUserモデルに関連するコードは次のとおりです。

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

3 に答える 3

2

ユーザーを serialize_into_cookie に渡す前に、ユーザーをリロードする必要がありました。

  sign_in(:user, user)
  current_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.reload),
      :expires => 3.months.from_now,
      :domain => ".app_name.com",
    }
  end
于 2012-07-20T22:06:57.350 に答える