Рельсы 6 как хранить извлеченный access_token из 3-го стороннего API

#ruby-on-rails

Вопрос:

У меня большой опыт интеграции стороннего API в Rails, но тогда мне не нужно было каждый раз запрашивать токен. Теперь я подумал, что это похоже, но через 2 недели неиспользования конечной точки оказалось, что срок действия токена истек (хотя, вероятно, этого не должно быть — в ответ я получил "expires_in":2591999 ). Я не мог найти никакого современного способа обработки извлечения и хранения токенов где-либо. То, что у меня есть, — это клиент и API, которые адаптированы к неиспользованному токену:

 #lib/client.rb
class Client
  include ::Errors

  API_ENDPOINT = 'https://some_endpoint.net/api/'
  ACCESS_TOKEN = Rails.application.credentials.sample_api[:access_token]

  def initialize
    @access_token = ACCESS_TOKEN
  end

  def post(path, options = {})
    handle_response(client.public_send(:post, path.to_s, options.to_json))
  end

  attr_reader :access_token

  private

  def client
    @client =
      Faraday.new(API_ENDPOINT) do |client|
        client.request :url_encoded
        client.response :json, content_type: /bjson$/
        client.adapter Faraday.default_adapter
        client.headers['Accept'] = 'application/json'
        client.headers['Content-Type'] = 'application/json'
        client.headers['Authorization'] = "Bearer #{access_token}" if access_token.present?
      end
  end

  def handle_response(response)
    return response_body(response) if response.success?

    raise error_class(response.status)
  end

  def response_body(response)
    return if response.body.blank?

    response.body
  end
end
 

С помощью класса API

 #lib/api.rb
class Api
  def get_account_details(options: {})
    client.get('account_details', options)
  end

  private

  def client
    @client ||= Client.new
  end
end
 

Поэтому, вероятно, теперь мне нужно реализовать какой FetchToken -то класс, который будет обрабатывать конечную api/token точку с некоторыми опциями. Что-то вроде:

 class FetchToken
  def fetch_access_token
    client.get('api/token', sample_options)
  end
  
  private
  
  def sample_options
    {
      username: username,
      password: password
    }
  end
end
 

Я прав? как должен выглядеть такой класс? где я должен сохранить ответ от api/token конечной точки, чтобы использовать его в Client классе как ACCESS_TOKEN ?