oauth2 を使った処理でOAuth2::Errorというふんわりしたエラーが発生したから何かと思ったら、アクセストークンの期限が切れてた。

READMEにはrefresh_token関連の記述はなさそうだったけど、メソッドは用意されている模様。
https://github.com/intridea/oauth2/blob/0ab3c213f7baa43f232eb18fa46301e1a9460f7d/lib/oauth2/access_token.rb#L80

こんな感じで更新できた。
(credentialsはomniauthのrequest.env['omniauth.auth'].credentialsを想定。)

  def initialize(credentials)
    self.client = OAuth2::Client.new(
      Settings.example.client_id,
      Settings.example.client_secret,
      site: Settings.example.site,
      ssl: { verify: false }
    )   
    self.access_token = OAuth2::AccessToken.new(
      client,
      credentials.token,
      refresh_token: credentials.refresh_token, # 追加
      expires_at: credentials.expires_at # 有効期限の判定のためこれも必要
    )   
    # トークンの有効期限が切れていたら更新する
    self.access_token = access_token.refresh! if self.access_token.expired?
    access_token
  end 

注意:access_tokenをDBとかに保存している場合は、更新した後のトークンを保存しておくこと。