提问者:小点点

跳过 Design 2.0 上 omniauth-Twitter 的电子邮件验证


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

我想强制用户提供一个电子邮件地址,用于发送时事通讯,广告...等

如何解决此问题?

谢谢你!


共3个答案

匿名用户

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

def email_required?
  super && provider.blank?
end

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

def password_required?
  super && provider.blank?
end

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

匿名用户

我正面临着同样的问题,Twitter不会通过oauth给你邮件,你必须用另一种方式来获得邮件。我想到的唯一解决方案是覆盖回调,使用twitter数据自动完成表单,让用户有机会自己完成邮件,然后注册并在数据库中保存用户。

看看以下问题:

使用OAuth验证用户的Twitter身份后,是否有办法获取用户的电子邮件ID?

匿名用户

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

在GitHub上:https://github.com/fertapric/rails3-mongoid-devise-omniauth/wiki/How-To:-检索-电子邮件-信息-(中间步骤)-来自-提供商-像-推特-或-LinkedIn

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