我正在使用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-twitter
和omniauth-facebook
个宝石。
有谁知道为什么?
如果您需要更多代码或信息,请与我们联系。
答案 0 :(得分:0)
Twitter不会将电子邮件地址作为OAuth握手的一部分发回。您必须生成一个或将它们发送到另一个注册页面,临时存储他们的Twitter授权信息以预先填充注册字段。
您似乎正在尝试根据用户的名称生成电子邮件地址。 Twitter以“FirstName LastName”的形式发送回来,因此如果您有任何电子邮件地址验证,他们将不会接受“FirstName LastName@someaddress.com”形式的电子邮件地址。我建议你改用"#{omniauth[:info][:nickname]}@twitter.com"
吗?这样,您也可以防止重复的电子邮件地址,因为Twitter用户名是唯一的。
答案 1 :(得分:0)
我不喜欢任何这些方法是诚实的。名称不是唯一约束,Twitter用户可以随时更改其昵称。如果用户更改了他的昵称会发生什么?他不能再访问他的帐户吗?如果另一个人将他的昵称改为现在可用的昵称怎么办?他能够访问其他用户的帐户吗?
两个更好的解决方案是:
关注Ryan Bates's approach并将用户重定向到可以输入电子邮件的表单。或
覆盖Devise的方法email_required?。类似的东西:
# user.rb
def email_required?
authentications.empty?
end
这样您就不会在登录过程中引入额外的步骤。