Обработка соединения через веб-сокет с недействительным токеном в Elixir / Phoenix - PullRequest
0 голосов
/ 13 февраля 2019

Мы используем Guardian для генерации токенов, которые затем используем для аутентификации при подключении к сокету Phoenix Channels.

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

Как вы справляетесь с такими случаями на стороне клиента?Есть ли какая-то конкретная ошибка, которую можно вернуть из Феникса, чтобы сообщить клиенту, в чем причина?Наша connect функция в user_socket.ex выглядит так:

def connect(%{"guardian_token" => token}, socket) do
  case Guardian.Phoenix.Socket.authenticate(socket, MyApp.Guardian, token) do
    {:ok, authed_socket} ->
      {:ok, authed_socket}

    {:error, _} ->
      :error
  end
end

Есть ли способ зафиксировать эту ошибку, используя библиотеку Phoenix JS для каналов Phoenix?Наша цель: 1) остановить повторные попытки, если токен истек, 2) потенциально выйти из системы или показать сообщение о том, что пользователь не в сети.Мы проверили документацию Phoenix JS , но не нашли ничего подходящего.

1 Ответ

0 голосов
/ 14 февраля 2019

Вы можете попытаться обновить токены при каждом подключении или в любое удобное для вас время

Может быть, что-то вроде этого

# Refresh a token and set it on connect
def connect(%{"guardian_token" => token}, socket) do

  case MyApp.Guardian.refresh(token) do

    {:ok, _old_stuff, {new_token, new_claims}} -> 
      case Guardian.Phoenix.Socket.authenticate(socket, MyApp.Guardian, new_token, new_claims) do
        {:ok, authed_socket} ->
          {:ok, authed_socket}
        {:error, _} ->
          :socket_auth_failed
      end

    _ ->
      {:token_refresh_failed, "could not refresh token"}
  end
end

...