【发布时间】:2011-08-20 06:31:01
【问题描述】:
我目前正在使用guide 尝试将 twitter 集成到 Devise。
这有点挑战性,因为 twitter 的 OAuth 不提供电子邮件地址。因此,注册流程应该是:
- 用户点击“使用 twitter 登录”
- Oauth 回调到 twitter 的回调
- 向用户询问电子邮件(我的网站需要)
- 登录用户。
我意识到如果用户已经在我的系统上拥有 Twitter 帐户,我必须能够找到该帐户。因此,我在用户模型中添加了 2 个额外字段:oauth_provider、oauth_uid。
在 omniauth_callbacks_controller 中:
定义推特 @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 中创建的用户将被擦除。
我怎样才能做到以下几点:
- 如果无法通过 oauth_provider 和 oauth_uid 找到用户,请使用这些凭据创建一个用户对象
- 将用户引导至 new_registration_url
- 当用户提交了他/她的电子邮件后,使用在 1) 中创建的相同用户对象创建用户
我尝试过使用 session,但它变得非常混乱,因为我必须修改 devise 的新补丁并为registrationscontroller.rb 创建。
请有人给我一个方法来做到这一点。
我还没有成功。让我给你看看我写了什么。
【问题讨论】:
标签: ruby-on-rails devise