ember-simple-auth: сохранение URL-адреса пользователя после ошибки ajax

Я применил ember-simple-auth-0.6.4.js в своем приложении ember-js, и есть один довольно распространенный случай. Вот последовательность шагов.

  1. Пользователь аутентифицируется в приложении (я использую для этого собственный аутентификатор). Таким образом, сеанс становится действительным.
  2. Через ~20 минут бездействия серверная сессия становится недействительной.
  3. Пользователь переходит к маршруту (производному от AuthenticatedRouteMixin), и, поскольку сеанс ember в клиентском приложении все еще действителен -> проверка «аутентифицированный сеанс» проходит.
  4. Затем вызывается хук модели маршрута, в котором я пытаюсь загрузить некоторые данные из бэкэнда с помощью запроса ajax - и получаю 401 неавторизованный ответ, потому что сессия бэкэнда недействительна.
  5. После ответа на ошибку 401 сеанс клиентского приложения становится недействительным - затем вызывается обработчик sessionInvalidationSucceeded(), определенный в application-route-mixin, где изменяется местоположение: window.location.replace(Configuration.applicationRootUrl);

Проблема в том, что если URL-адрес, определенный в applicationRootUrl, находится под аутентифицированным маршрутом, пользователю будет показана страница входа, но после аутентификации пользователь снова переходит на applicationRootUrl, но не на страницу, где изначально произошла ошибка ajax.

Мое решение этого:

  • В хуке AuthenticatedRouteMixin перед моделью() я сохраняю последний переход:

    Configuration.beforeInvalidationTransition = transition;

  • В ApplicationRouteMixin я переопределяю хук sessionInvalidatedSucceeded:

    sessionInvalidationSucceeded: function() { if (Configuration.beforeInvalidationTransition) { this.get(Configuration.sessionPropertyName) .set('attemptedTransition',Configuration.beforeInvalidationTransition); } this.transitionTo(Configuration.authenticationRoute);

Таким образом, если произошла ошибка 401, пользователь перенаправляется на страницу входа в систему (Configuration.authenticationRoute), а маршрут, в котором произошла ошибка, сохраняется в файле trypedTransition, поэтому после успешного входа пользователь будет перенаправлен на то место, где он перестал работать.

Есть ли смысл или есть более элегантное решение этой проблемы?


person Vladislav Lezhnin    schedule 30.07.2014    source источник


Ответы (1)


На самом деле вы можете сразу сохранить последний переход в сеансе, не используя Configuration.beforeInvalidationTransition. Вы также можете обновить токен доступа до истечения срока его действия, как это делает аутентификатор OAuth 2.0 (см. здесь: https://github.com/simplabs/ember-simple-auth/blob/master/packages)./ember-simple-auth-oauth2/lib/simple-auth-oauth2/authenticators/oauth2.js#L167)

person marcoow    schedule 31.07.2014
comment
Спасибо за ответ! И не должна ли эта логика сохранения последнего перехода в сеансе быть частью микширования аутентифицированного маршрута? Я хотел бы знать последний переход на аутентифицированный маршрут, чтобы повторить попытку после успешного входа в систему. - person Vladislav Lezhnin; 01.08.2014
comment
Эта функциональность на самом деле является частью библиотеки, но не для случая, когда срок действия сеанса истек. Также было бы трудно обнаружить случай, когда срок действия сеанса истек, например. 401 может иметь другую причину, например. пользователь пытается сделать что-то. им не разрешено. - person marcoow; 01.08.2014