0

我正在尝试为我当前的设计系统添加身份验证控制器,以便通过 facebook 和 twitter 提供多个登录。为此,我正在关注本教程:http ://railscasts.com/episodes/236-omniauth-part-2

我的问题是,对于尚未注册并尝试在 Twitter 上注册的人。所以我需要为此创建用户和身份验证。

我的代码如下:

      user = User.new
      token = omni['credentials'].token
      token_secret = omni['credentials'].secret
      user.provider = omni.provider
      user.uid = omni.uid

      user.authentications.build(:provider => omni['provider'], :uid => omni['uid'], :token => token, :token_secret => token_secret)

      if user.save
        flash[:notice] = "Logged in."
        sign_in_and_redirect(:user, user)                
      else
        session["devise.user_attributes"] = user.attributes
        redirect_to new_user_registration_path
      end 

因此,在注册过程结束时,会创建新用户。但是在数据库中,我没有看到任何关于该用户的 Twitter 身份验证记录。

那是因为 user.authentications.build 吗?

如果你能帮助我,那就太好了。

谢谢。

4

4 回答 4

3

作为数据点:您所指的 railscasts 引用了 Omniauth pre-1.0,它的策略与 railscsts 引用的策略略有不同。(注意:我使用的是您在实时站点上引用的确切方法)。在这种情况下,构建调用“apply_omniauth” -

确保您已创建(正如他们在视频中引用的那样),一个用于构建资源的注册控制器。这是我当前的工作示例:

    class RegistrationsController < Devise::RegistrationsController
  def create
    super
    session[:omniauth] = nil unless @user.new_record?
  end

  private

  def build_resource(*args)
    super
    if session[:omniauth]
      # apply omniauth calls the user model and applies omniauth session to the info
      @user.apply_omniauth(session[:omniauth])

      #
      @user.valid?
    end
  end
end

但是,您仍然需要创建身份验证记录,这是我的确切调用:

current_user.authentication.create!(:provider => omniauth['provider'], :uid => omniauth['uid'])

希望能帮助到你。

于 2012-11-14T22:00:33.573 回答
2

是的,这是因为构建

User.build # allocates a new record for you
User.create # allocates and then saves a new record for you

所以我想你想要

user.authentications.create(:provider => omni['provider'], 
                            :uid => omni['uid'], 
                            :token => token, 
                            :token_secret => token_secret)

另外,你应该处理创建不保存的情况(验证问题)

于 2012-11-14T21:58:49.057 回答
0

我想如果你使用的是 Devise+Omniauth ,你可以看看这个更新的Railscast。新版本的 Devise gem 原生支持 OmniAuth。

于 2012-11-14T21:57:33.923 回答
0

是的,这是因为构建,它用于构建记录而不将其保存在数据库中(就像新的一样)。

如果在您的模型中User has_many :authentications,您可以将autosave选项设置为 true 以在保存用户时自动保存身份验证:

has_many :authentications, autosave: true

于 2012-11-14T22:27:10.017 回答