Rails, devise: как заменить предыдущий вход через аутентификацию токена

#ruby-on-rails #authentication #replace #devise

#ruby-on-rails #аутентификация #заменить #разработка

Вопрос:

Я использую devise с модулем TokenAuthentication

И все в порядке, когда я не прошел проверку подлинности и перешел по ссылке с ?auth_token = part. Вот так:

Я перехожу по ссылке: /orders?auth_token=q2a8w6virARzv6B2C1vR где q2a8w6virARzv6B2C1vR находится authentication_token user1. И теперь я вошел в систему как пользователь1.

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

Вот так:

  1. Я вхожу через страницу входа. Я ввожу адрес электронной почты и пароль user2. И теперь я вошел в систему как пользователь2
  2. Я перехожу по ссылке: /orders?auth_token=q2a8w6virARzv6B2C1vR где q2a8w6virARzv6B2C1vR находится authentication_token user1. И я все еще вошел в систему как пользователь2 вместо ожидаемого пользователя 1.

Это ошибка? И каковы наилучшие методы изменения этого поведения, чтобы принудительно заменить аутентификацию через токен?

Rails 3.0.6

Разработка 1.2.1

Ответ №1:

вы раскомментировали:token_authenticatable в своей пользовательской модели, правильно?

Комментарии:

1. Да, конечно, я раскомментировал :token_authenticatable в пользовательской модели

Ответ №2:

Давайте займемся некромантией вопросов…

Перед запуском stragegies (token_authenticatable, database_authenticatable) Надзиратель сначала проверяет, настроен ли пользователь уже в текущем сеансе.

Это происходит в: https://github.com/hassox/warden/blob/3d653371a2ff594d9965c1dde642c98cd8485e15/lib/warden/proxy.rb#L212

Предполагается ли, что запрос action responsing / orders использует только аутентификацию токена? Если это так, вы можете добавить: before_filter: reset_session (перед authorize_user ), чтобы Надзирателю не удалось отменить сериализацию пользователя из сеанса и он был вынужден выполнить аутентификацию.

[РЕДАКТИРОВАТЬ] Этот запрос на выпуск содержит разумное решение:https://github.com/plataformatec/devise/issues/1644