0

我正在使用 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.

4

3 回答 3

1

第 23 行sign_in(authentication.user)失败,因为您处于if authentication条件的 else 分支(authenticationnil 也是如此)。您可能打算做的是调用sign_in(user)您刚刚在上面创建的几行的用户。

于 2013-04-11T03:33:55.200 回答
0

首先,您测试是否authentication已定义,然后在else块中,如果未定义,它将仅触发,您authentication.user出于某种原因去引用。这不可能奏效。

如果您尚未进行身份验证且未登录,则该条件似乎适用。sign_in在这种情况下,您为什么要使用该功能?

于 2013-04-11T03:33:47.393 回答
0

如果您在数据库中使用一组提供者列表,请确保

> :provider => omniauth['provider']

例如,与数据库中的提供者匹配。如果您facebook_Oauth2的数据库中有并且提供者响应是facebook身份验证将失败。

于 2015-07-26T18:28:03.500 回答