Я пишу библиотеку для вызова стороннего 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, стоит ли хранить токен в переменной сеанса?
Заранее спасибо!