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

时间:2020-10-18 14:16:26

标签: ruby-on-rails ruby twitter devise omniauth

在我的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

2 个答案:

答案 0 :(得分:0)

  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

答案 1 :(得分:0)

我使用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