如何更新 Twitter omniauth 访问令牌和访问令牌密码

How to update twitter omniauth access token and access token secret

在我的 rails 6 应用程序中,用户必须使用 Twitter omniauth 登录并设计。我已经能够按照这个 tutorial.

来实现它

我遇到的问题是,当用户从他们的 Twitter 帐户撤销我的应用程序权限时,我之前保存到数据库中的 omniauth 访问令牌和访问机密将变得无效。如果同一用户决定重新进行身份验证,则该用户可以访问应用程序,但用户的令牌不会在数据库中更新,从而使现有令牌无效。

我的问题是,如何持续更新数据库中的用户列,以便继续从 Twitter 接收有效的访问令牌,尤其是当用户拥有访问令牌时。

这是我的用户模型中的相关代码

  def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
    user.email = auth.info.email
    user.password = Devise.friendly_token[0, 20]
    user.name = auth.info.name
    user.username = auth.info.nickname
    user.location = auth.info.location
    user.access_token = auth.credentials.token
    user.access_secret = auth.credentials.secret
    end
  end

我的用户控制器看起来像这样

  def twitter
    @user = User.from_omniauth(request.env["omniauth.auth"])

    if @user.persisted?
      sign_in_and_redirect @user, event: :authentication #this will throw if @user is not activated
      set_flash_message(:notice, :success, kind: "Twitter") if is_navigational_format?
    else
      session["devise.twitter_data"] = request.env["omniauth.auth"].except("extra")
      redirect_to new_user_registration_url
    end
  end
  1. 找到用户。
  2. 如果没有用户 - 创建用户。
  3. 使用新的 omniauth 数据更新用户(现有用户和新用户)

像这样的东西应该可以完成工作:

def self.from_omniauth(auth)
  #find from omniauth
  user = User.where(email: auth.email).first

  #find or create
  user ||= User.create(
    email: data["email"],
    password: Devise.friendly_token[0, 20]
  )
  #update with fresh data
  user.name = auth.info.name
  user.image = auth.info.image
  user.expires = auth.credentials.expires
  user.refresh_token = auth.credentials.refresh_token
end

我通过 find_or_initialize_by

得到了它
   def self.from_omniauth(auth)
    user = find_or_initialize_by(provider: auth.provider, uid: auth.uid)
    user.email = auth.info.email
    user.password = Devise.friendly_token[0, 20]
    user.name = auth.info.name
    user.username = auth.info.nickname
    user.location = auth.info.location
    user.access_token = auth.credentials.token
    user.access_secret = auth.credentials.secret
    user.save!
    return user
  end