我正在使用Omniauth尝试在我的网络应用上注册/登录用户。
这发生在我的AuthenticationsController#Create
方法中:
身份验证控制器:
class AuthenticationsController < InheritedResources::Base
def create
omniauth = request.env['omniauth.auth']
authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
if authentication
flash[:success] = "Signed in successfully"
sign_in_and_redirect(authentication.user)
elsif current_user
token = omniauth['credentials'].token
secret = omniauth['credentials'].secret
current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid'], :token => token, :secret => token_secret)
flash[:success] = "Authentication successful"
redirect_to authentications_url
else
user = User.new
user.apply_omniauth(omniauth)
if user.save!
flash[:success] = "Account created"
sign_in(authentication.user)
else
session[:omniauth] = omniauth.except('extra')
redirect_to '/signup'
end
end
end
我最初有sign_in(:user, authentication.user)
,但它给了我参数错误,因此我在上面的代码中将其更改为had sign_in(authentication.user)
。但是,现在我得到NoMethodError - undefined method 'user' for nil:NilClass
。
答案 0 :(得分:1)
第23行sign_in(authentication.user)
失败,因为您处于if authentication
条件的else分支(因此authentication
为零)。
您可能要做的是为刚刚创建了几行的用户致电sign_in(user)
。
答案 1 :(得分:0)
首先测试是否定义了authentication
,然后在else
块中,只有在未定义的情况下才会触发,出于某种原因,您将引用authentication.user
。这可能无法奏效。
如果您未经过身份验证且未登录,则该条件似乎适用。在这种情况下,您为什么要使用sign_in
函数?
答案 2 :(得分:0)
如果您在数据库中使用了一组提供程序,请确保
> :provider => omniauth['provider']
例如,与db中的提供程序匹配。如果您的数据库中有facebook_Oauth2
且提供程序响应为facebook
,则验证将失败。