1

我正在使用omniauth 让用户在Ruby on Rails 应用程序中使用Facebook 和Twitter 帐户登录。由于 Twitterrequest.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安装了宝石。有谁知道为什么?如果您需要更多代码或信息,请告诉我。

4

2 回答 2

0

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

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

于 2012-12-14T09:22:24.380 回答
0

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

两个更好的解决方案是:

  1. 按照Ryan Bates 的方法,将用户重定向到可以键入电子邮件的表单。或者

  2. 覆盖 Devise 的方法email_required?. 就像是:

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

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

于 2012-12-14T13:45:49.563 回答