omn​​iauth和twitter的SQLite错误

时间:2012-12-13 11:18:16

标签: ruby-on-rails twitter omniauth

我正在使用omniauth让用户在Ruby on Rails应用程序中使用Facebook和Twitter帐户登录。由于Twitter request.env["omniauth.auth"]未提供帐户的电子邮件,因此构建它(电子邮件在数据库中不能为NULL)。我有这段代码:

if params[:provider] == 'facebook'
              email = omniauth[:info]["email"]
elsif params[:provider] == 'twitter'
              email = omniauth[:info]["name"] + '@example.com'
end
user = User.new(:email => email)

如果我使用Facebook帐户登录,则效果很好。但是,如果我尝试使用Twitter帐户,应用程序会给我这个错误:

SQLite3::ConstraintException: users.email may not be NULL [SQL query]

我检查过电子邮件是否多次为NULL,以防它构造不当或其他东西,但不是NULL。已安装omniauth-twitteromniauth-facebook个宝石。 有谁知道为什么? 如果您需要更多代码或信息,请与我们联系。

2 个答案:

答案 0 :(得分:0)

Twitter不会将电子邮件地址作为OAuth握手的一部分发回。您必须生成一个或将它们发送到另一个注册页面,临时存储他们的Twitter授权信息以预先填充注册字段。

您似乎正在尝试根据用户的名称生成电子邮件地址。 Twitter以“FirstName LastName”的形式发送回来,因此如果您有任何电子邮件地址验证,他们将不会接受“FirstName LastName@someaddress.com”形式的电子邮件地址。我建议你改用"#{omniauth[:info][:nickname]}@twitter.com"吗?这样,您也可以防止重复的电子邮件地址,因为Twitter用户名是唯一的。

答案 1 :(得分:0)

我不喜欢任何这些方法是诚实的。名称不是唯一约束,Twitter用户可以随时更改其昵称。如果用户更改了他的昵称会发生什么?他不能再访问他的帐户吗?如果另一个人将他的昵称改为现在可用的昵称怎么办?他能够访问其他用户的帐户吗?

两个更好的解决方案是:

  1. 关注Ryan Bates's approach并将用户重定向到可以输入电子邮件的表单。或

  2. 覆盖Devise的方法email_required?。类似的东西:

    # user.rb
    def email_required?
      authentications.empty?
    end
    

    这样您就不会在登录过程中引入额外的步骤。