Запомнить меня функциональность в Фениксе с помощью Guardian

Я разрабатываю систему входа в систему для веб-приложения, использующего Guardian для обработки аутентификации. В моем конфиге Guardian у меня есть

ttl: {30, :days}

Пользовательский токен сохраняется в файлах cookie по телефону:

defp login(conn, user) do
  conn
  |> Guardian.Plug.sign_in(user)
end

Таким образом, токен действует в течение 30 дней и остается там, даже если браузер закрыт (ожидаемое поведение для файла cookie). Пользователь, однако, должен иметь возможность выбирать, запоминаться или нет при входе в систему. Если нет, токен должен быть удален из куки при закрытии окна браузера. Я пытался установить

ttl: {0, :days}

и, кажется, для достижения необходимого поведения. Сказал, что:

  1. Является ли ttl: {0,:days} правильным способом аутентификации пользователя, пока окно браузера не закроется? Если да, то как программно изменить значение ttl в конвейере перед вызовом Guardian.Plug.sign_in(conn, user)?
  2. Может ли Guardian хранить токен в файлах cookie или в хранилище сеансов в зависимости от выбора пользователя? (куки для избранных запомни меня, сессионное хранилище, если нет)

1 ответ

Решение

Может быть, проверить Guardian.Plug.remember_me/4 функция Есть пример на GitHub Guardian.

# Set a "refresh" token directly on a cookie.
# Can be used in conjunction with `Guardian.Plug.VerifyCookie`
conn = MyApp.Guardian.Plug.remember_me(conn, resource)

Изменение TTL здесь очень опасно, потому что это означает, что сразу после входа в систему у вас истек токен, поэтому каждый отдельный маршрут API не будет работать, если вы авторизуете запрос на основе токена.

Guardian может сохранять сеанс и токен одновременно, поэтому, вероятно, вам потребуется настроить систему аутентификации в соответствии с вашими потребностями.

Другие вопросы по тегам