Devise 无法获取 Twitter 帐户的电子邮件

我正在使用 Rails 构建社交登录,并且已成功将其与 Google 和 Facebook 集成。所以,我对 Twitter 也这样做。但我无法在登录 Twitter 后重定向到我的应用程序。我收到如下错误:

activeRecord::RecordInvalid in Users::OmniauthCallbacksController#twitter 验证失败:Email 不能为空,Email 不能为空,Email 无效

这是我在控制器中的代码:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    generic_callback("facebook")
  end

  def google_oauth2
    generic_callback("google_oauth2")
  end

  def twitter
    generic_callback("twitter")
  end

  def generic_callback provider
    @user = User.from_omniauth(request.env["omniauth.auth"])
    if @user.persisted?
      log_in @user
      flash[:success] = t("users.new.welcome")
      redirect_to @user
    else
      flash[:error] = t("sessions.new.error")
      redirect_to root_url
    end
  end

  def failure
    redirect_to root_path
  end
end

模型中获取数据的部分代码

# Generate data from the social
  def self.from_omniauth(auth)
    user = User.where(email: auth.info.email).first
    password = Devise.friendly_token[0,20]
    user ||= User.create!(provider: auth.provider,uid: auth.uid,email: auth.info.email,name: auth.info.name,password: password,password_confirmation: password)
  end

并在文件中配置 devise.rb

config.omniauth :google_oauth2,ENV["CLIENT_ID"],ENV["CLIENT_SECRET"],scope: "email",info_fields: "email,name"
config.omniauth :facebook,ENV["FACEBOOK_ID"],ENV["FACEBOOK_SECRET"],name"
config.omniauth :twitter,ENV["TWITTER_ID"],ENV["TWITTER_SECRET"],name"
lt277602467 回答:Devise 无法获取 Twitter 帐户的电子邮件

默认情况下,Devise 用户需要电子邮件。您看到的错误是验证失败,因为您没有收到 Twitter 响应中的电子邮件。 (您没有显示实际 OAuth 请求的任何代码,但为了论证起见,我假设身份验证成功并且您实际上通过重定向回您的应用程序获得了有效响应。)>

根据 Twitter API docs,请求用户的电子邮件是一种提升的权限:

“请求用户的电子邮件地址”复选框位于 developer.twitter.com 上的应用程序权限。隐私政策网址和 必须在应用程序设置中填写服务条款 URL 字段 电子邮件地址访问功能的顺序。如果启用,用户将 通过 oauth/authorize 对话框通知您的应用程序可以访问他们的 电子邮件地址。

此外,文档指出:

如果用户的帐户中没有电子邮件地址,或者 电子邮件地址未验证,将返回空值。

因此,您需要确保正确配置您的应用的权限以接收任何电子邮件,即使如此,您也不能依赖于收到电子邮件。

另一种方法是在您的设计用户模型中禁用电子邮件验证,如下所示:

class User < ApplicationRecord
  ...
  def email_required?
    false
  end
end

编辑:Twitter API 要求调用者还明确要求提供帐户电子邮件(在请求中传递 include_email=true)。查看 omniauth-twitter 中的代码——我假设您正在使用它——它确实这样做了,所以如果您的应用权限已配置并且帐户具有经过验证的电子邮件,您应该会得到它。

本文链接:https://www.f2er.com/3483.html

大家都在问