在devise 2.0上跳过omniauth-twitter的电子邮件验证

时间:2012-04-19 10:30:21

标签: ruby-on-rails ruby-on-rails-3 devise omniauth

我正在使用devise 2.0和gem omniauth-twitter

问题是twitter没有发送电子邮件作为回应,因此我的应用程序的模型用户验证了有一封电子邮件,我在回调中收到以下错误:

Email can't be blank

我在 user.rb 模型中有这个:

#config omniauth twitter
def self.find_for_twitter_oauth(access_token, signed_in_resource = nil)
    data = access_token.extra.raw_info
    if user = User.where(:username => data.screen_name).first
        user
    else
        User.create!(:username => data.screen_name, :password => Devise.friendly_token)
    end
end

我在 omniauth_callbacks_controller.rb

中有这个
  def twitter
    @user = User.find_for_twitter_oauth(request.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
      # http://stackoverflow.com/questions/7117200/devise-for-twitter-cookie-overflow-error
      session["devise.twitter_data"] = request.env["omniauth.auth"].except('extra')
      redirect_to new_user_registration_url
    end
   end

我希望用户强制为发送简报,广告客户等提供电子邮件地址

如何解决此问题?

谢谢!

4 个答案:

答案 0 :(得分:29)

将此添加到您的用户模型:

def email_required?
  super && provider.blank?
end

您可以使用等效的密码方法:

def password_required?
  super && provider.blank?
end

这应该在使用Omniauth提供程序时覆盖字段要求。

答案 1 :(得分:2)

我面临同样的问题,Twitter没有通过oauth给你发电子邮件,你必须以另一种方式思考获取电子邮件。我想出的唯一解决方案是覆盖回调并使用twitter数据自动填写表单,并让用户自己完成邮件,然后注册并将用户保存在数据库中。

看下面的问题:

Is there a way to get an user's email ID after verifying his/her Twitter identity using OAuth?

答案 2 :(得分:2)

这里详细解释了一个解决方案: http://asciicasts.com/episodes/236-omniauth-part-2

在GitHub上: https://github.com/fertapric/rails3-mongoid-devise-omniauth/wiki/How-To:-Retrieve-email-information-(middle-step)-from-providers-like-Twitter-or-LinkedIn

出于某种原因,这个问题在Google的排名中显示出比这些链接更高的问题,所以我想我会将它们添加到答案中。

答案 3 :(得分:0)

您需要删除电子邮件字段的状态验证。 关注this post,看看是否有效。 对于迟到的回复感到抱歉,希望这会有所帮助。

相关问题