将Devise与Twitter集成

时间:2011-08-19 22:24:49

标签: ruby-on-rails devise

我目前正在使用此guide尝试将twitter集成到Devise中。

这有点挑战,因为Twitter的OAuth不提供电子邮件地址。因此,注册的流程应为:

  1. 用户点击“使用Twitter登录”
  2. Oauth回拨Twitter的回调
  3. 要求用户提供电子邮件(我的网站需要)
  4. 登录用户。
  5. 我意识到如果用户已经在我的系统上拥有Twitter帐户,我必须能够找到该帐户。因此,我在用户模型中添加了2个额外字段: oauth_provider,oauth_uid

    在omniauth_callbacks_controller中:

    def twitter     @user = User.find_for_twitter_oauth(env [“omniauth.auth”],current_user)

    if @user.persisted?
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Twitter"
      sign_in_and_redirect @user, :event => :authentication
    else
      flash[:warn] = "We still need a little more info!"
      redirect_to new_user_registration_url
    end
    

    在user.rb

      # The trick here is that twitter does not give you an email back
      # So we should make use of uid and provider
      def self.find_for_twitter_oauth(oauth_hash, signed_in_resource=nil)
        uid = oauth_hash['uid']
        if user = User.find_by_oauth_provider_and_oauth_uid('twitter', uid)
          user
        else 
          User.create(:password => Devise.friendly_token[0,20],
                      :oauth_provider => "twitter", 
                      :oauth_uid => oauth_hash['uid'])
        end
      end
    

    但是,我已经彻底调试了这一点,并意识到如果我将用户重定向到new_registration_url,将删除在user.rb中创建的用户。

    如何执行以下操作:

    1. 如果无法通过oauth_provider和oauth_uid找到用户,请使用这些凭据创建一个User对象
    2. 将用户指向new_registration_url
    3. 当用户提交了他/她的电子邮件时,请使用在1)
    4. 中创建的相同用户对象创建用户

      我已经尝试过使用会话,但它变得非常混乱,因为我必须使用patch patch devise的新版本并为registrationscontroller.rb创建。

      请有人为我提供一种方法。

      我还没有成功。让我告诉你我写的是什么。

1 个答案:

答案 0 :(得分:0)

我按照这两个截屏视频,这正是你想要的。

你可以尝试一下!他正在使用omniauth gem,这非常简单和令人敬畏: - )

http://railscasts.com/episodes/235-omniauth-part-1

http://railscasts.com/episodes/236-omniauth-part-2