Как я должен хранить значение для Rails-приложения, которое периодически изменяется, но должно быть доступным для всех пользователей? - PullRequest
1 голос
/ 18 апреля 2019

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

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

Это нормально, за исключением того, что оно устанавливает потенциальное состояние гонки, как только приложение становится доступным для общественности. Вполне возможно, что два запроса могут поступить практически одновременно, дважды сбросив токен, сделав один из последующих запросов на получение данных токеном, который больше не действителен.

Я хотел использовать переменную $ global для хранения токена и даты / времени его обновления, чтобы он всегда был доступен для всех пользователей и обновлял токен только в том случае, если ему исполнилось несколько часов.

Это решило бы проблему состояния гонки, но из всего, что я читаю, ИСПОЛЬЗОВАНИЕ ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ В РЕЙЛЯХ ПЛОХО. Мне кажется, этот вариант использования является исключением, но я хочу сделать это правильно.

Является ли мой единственный вариант сохранения этих значений в моей собственной базе данных? Кажется глупым настраивать модель данных для таблицы, которая будет содержать только два столбца и две строки, но я не знаю, является ли это Rails Way (TM) или Best Way.

Любой совет приветствуется.

1 Ответ

3 голосов
/ 18 апреля 2019

Вы можете использовать кеш Rails для этого.Он хранится в памяти или в энергозависимой базе данных, такой как Redis.Вы можете получить что-то вроде:

def a_cool_token
  Rails.cache.fetch("a_cool_token", expires_in: 2.hours.to_i) do
    a_method_to_regenerate_a_cool_token
  end
end

Что произойдет:

  1. При использовании a_cool_token для передачи его в запрос он попытается извлечь его из кэша;
  2. Если срок действия ключа кеша истек или не определен, возвращается a_method_to_regenerate_a_cool_token;
  3. Когда время, установленное на expires_in, проходит, ключ становится недействительным.

Youвсегда может использовать более полный ключ кеша, используя какой-то запрос к базе данных для его создания, например:

Rails.cache.fetch("a_cool_token/#{some_timestamp_that_gets_updated_with_a_cool_token}", expires_in: 2.hours.to_i)

Реализация def some_timestamp_that_gets_updated_with_a_cool_token может получить данные при последнем обновлении токена, избегая устаревших ответов, если токен что-то еще меняетснаружи a_cool_token

Надеюсь, это поможет вам найти "хорошее" решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...