【问题标题】:SQLite error with omniauth and twitteromn​​iauth 和 twitter 的 SQLite 错误
【发布时间】:2012-12-14 21:45:49
【问题描述】:

我正在使用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 gems 已安装。 有谁知道为什么? 如果您需要更多代码或信息,请告诉我。

【问题讨论】:

    标签: ruby-on-rails twitter omniauth


    【解决方案1】:

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

    两个更好的解决方案是:

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

    2. 覆盖 Devise 的方法 email_required?。比如:

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

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

    【讨论】:

    • 我尝试了 Ryan Bate 的方法,但得到了相同的结果。我想我在某个地方遗漏了一些东西,我看不到它。我会再试一次,我会告诉你我的结果。
    • 我终于设法使用 twitter 帐户登录,我正在尝试重定向,以便用户输入他的电子邮件。我也更喜欢那个解决方案而不是另一个 :) 谢谢你们俩
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 2011-10-06
      • 2011-09-30
      • 2011-09-24
      • 1970-01-01
      相关资源
      最近更新 更多