我正在尝试显式创建一个类似于此UserSession.create(@user, true)
的会话,但会话未创建,current_user
为nil
。
但是当我这样做时,我得到< #UserSession:{:unauthorized_record =>“”}>
us = UserSession.create(@user, true)
RAILS_DEFAULT_LOGGER.info(us.inspect) #=> UserSession: {:unauthorized_record=>""}
我在这里看了Authlogic::Session::UnauthorizedRecord
小心这一点,因为Authlogic假设你已经确认用户是他所说的那个人。例如,这是用于在内部持久化会话的方法。 Authlogic使用持久性令牌查找用户。此时我们知道用户是他所说的用户,因此Authlogic只会创建一个包含该记录的会话。这对于第三方身份验证方法(例如OpenID)特别有用。让该方法验证身份,一旦验证,就传递对象并创建会话。
这正是我想要做的事情(我正在使用omniauth进行身份验证并使用authlogic创建会话)。
如何解决此问题,以便我可以在current_user
中获得有效的会话?
答案 0 :(得分:3)
我有一个类似的问题,因为persistence_token是用户的nil。在创建UserSession之前重置它。所以......
@user.reset_persistence_token!
UserSession.create(@user, true)
答案 1 :(得分:2)
我不确定.create(object,bool)方法签名,但以下工作使用authlogic。
class Api::ApiBaseController < ApplicationController
protected
def verify_token
return false if params[:token].blank?
@session = UserSession.new(User.find_by_single_access_token(params[:token]))
@session.save
end
end
如果这对您不起作用 - 我认为@user未正确设置。
答案 2 :(得分:1)
如果您将active_record_store
映射到authlogic user_sessions
表,您的会话信息将存储在数据库中,您将能够存储更大的数据集。
在配置文件夹中:
config/initializers/session_store.rb
App::Application.config.session_store :cookie_store, :key => '_App_session'
App::Application.config.session_store :active_record_store
config/application.rb
ActiveRecord::SessionStore::Session.table_name = 'user_sessions'
重新启动您的应用,用户会话中存储的所有信息都将保存在authlogic user_sessions表中。
转到:http://apidock.com/rails/ActiveRecord/SessionStore 有关更多信息
答案 3 :(得分:0)
现在你可以替换
UserSession.create @user
到
UserSession.create :email => @user.email, :password => @user.password
没什么大不了的。
但这让我感到异常。我忘记了我的用户在创建时获得了active? == false
。我已将其设置为true
并创建了会话。
答案 4 :(得分:0)
我今天遇到了这个问题。在我的情况下,它最终与CSRF令牌有关。
我们正在我们的应用中创建用户和会话以响应OAuth回调。看来如果CSRF令牌无效,来自第三方的情况就是这样,authlogic不会创建用户会话。
无法验证CSRF令牌真实性
修复很简单:
class Oauth::UserSessionsController < ApplicationController
skip_before_action :verify_authenticity_token, only: :callback
def new
# code removed...
end
def callback
# code removed...
UserSession.create(@user)
redirect_to root_path
end
end