Где я должен хранить токен при вызове API из моего приложения Rails? - PullRequest
0 голосов
/ 19 сентября 2019

Я пишу библиотеку для вызова стороннего API, чтобы она могла использоваться приложением Rails.Для аутентификации API изначально использует базовую аутентификацию для возврата токена, который используется для всех других запросов.Токены остаются действительными в течение 1 часа, и можно получить несколько токенов, используя одни и те же базовые учетные данные аутентификации, без аннулирования каких-либо других.

Вот урезанная версия того, что я получил до сих пор:

# frozen_string_literal: true

require "rest-client"

class AcmeClient
  ACME_API_URL = Application.secrets.acme[:url]
  ACME_API_KEY = Application.secrets.acme[:key]
  ACME_API_SECRET = Application.secrets.acme[:secret]

  def health_check
    url = ACME_API_URL + "api/health"
    token = fetch_token
    RestClient.get url, { Authorization: "Bearer #{token}"}
  end

  private

  def fetch_token
    url = ACME_API_URL + "/api/token"
    response = RestClient::Request.execute(
      method: :post,
      url: url,
      user: ACME_API_KEY,
      password: ACME_API_SECRET,
      payload: "grant_type=client_credentials"
    )
    JSON.parse(response.body)["access_token"]
  end
end

Я включил метод health_check в качестве примера доступных конечных точек API.

Поскольку ранее использовались только существующие гемы для вызова API, я не уверен, что делать стокен, который возвращается.Я не хочу извлекать новый перед каждым вызовом API, так как это кажется излишне избыточным, поэтому я предполагаю, что имеет смысл хранить его где-то.

В этом случае было бы лучше создатьтаблицу базы данных acme_tokens с столбцами token и expires_at, а затем проверять срок действия перед каждым новым вызовом API?

Или, так как вызовы API будут инициироваться действиями пользователя во внешнем интерфейсенашего приложения на Rails, стоит ли хранить токен в переменной сеанса?

Заранее спасибо!

1 Ответ

2 голосов
/ 19 сентября 2019

Итак, я думаю, вы можете использовать rails low-level cache для хранения токена.Измените свой метод fetch_token, как показано ниже:

  def fetch_token
    Rails.cache.fetch("#{cache_key_with_version}/my_api_token", expires_in: 1.hour) do
      url = ACME_API_URL + "/api/token"
      response = RestClient::Request.execute(
        method: :post,
        url: url,
        user: ACME_API_KEY,
        password: ACME_API_SECRET,
        payload: "grant_type=client_credentials"
      )
      JSON.parse(response.body)["access_token"]
    end
  end

Он вернет ваш токен, пока кэш активен, и запросит новый, если срок его действия истек.Также вам нужно настроить cache_store в среде разработки / производства.

...