Больше не может войти в систему при обновлении Ember 2.x -> 3.x с помощью ember-simple-auth - PullRequest
0 голосов
/ 17 июня 2020

РЕДАКТИРОВАТЬ: Добавлены детали в первые 2 абзаца, касающиеся управления версиями и рабочего процесса входа в систему. РЕДАКТИРОВАТЬ 2: Добавлен пошаговый код точки останова.

Как видно из заголовка, у меня возникли проблемы со входом в свое приложение после обновления с Ember 2.x до 3.x (особенно в в данном случае от 2.18.2 до 3.12.1). Раньше Ember вызывал мой сервер, возвращал токен, а затем ember-simple-auth обрабатывал этот токен, аутентифицировал пользователя и перенаправлял меня на мой авторизованный маршрут. Теперь вместо этого, после того, как токен возвращен (все еще успешно), ничего не происходит, и я остаюсь на экране входа в систему (который перезагружается). В консоли разработки нет никаких сообщений об ошибках.

Я пробовал следовать этому руководству: https://github.com/simplabs/ember-simple-auth/blob/master/guides/upgrade-to-v3.md, которое, как я полагал, было необходимо, так как ранее была версия 1.5.1 и, вероятно, также необходимо было обновить вместе с основной версией Ember (и оставить ее на v1.5.1 также все равно не сработало).

Но руководство по обновлению для меня не имело смысла. Я попытался установить значения authenticationRoute, routeAfterAuthentication и routeIfAlreadyAuthenticated соответственно для конкретных маршрутов, которые использует мое приложение, и по мере выполнения кода с точками останова я вижу, что значения устанавливаются правильно, но без кубиков. Ни один из других шагов не применим к моему конкретному случаю.

Вот изменения, которые я внес на основе руководства -

защищено. js (все, что я здесь сделал, это добавил определение authenticationRoute):

import { inject as service } from '@ember/service';
import { isNone } from '@ember/utils';
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
import AutoScrollMixin from 'erm/mixins/auto-scroll';

export default Route.extend(AuthenticatedRouteMixin, AutoScrollMixin, {
  authenticationRoute: 'login',
  session: service(),
  userIdle: service(),
  currentUser: service(),

  model(/*params, transition*/){
    var self = this;

    self.get('userIdle').on('idleChanged', (isIdle) => {
      if (isIdle) {
        self.get('session').invalidate();
        self.replaceWith('login');
      }
    });

    if( this.get('session.isAuthenticated') ) {
      var user = self.get('currentUser.user');
      if( user && user.get('temp_password') ) {
        this.transitionTo('change-password');
      }
    } else {
      if( isNone(this.get('session.isAuthenticated')) ||
          this.get('session.isAuthenticated') !== true ) {
        self.replaceWith('login');
      }
    }
  },
});

приложение. js (только что добавлена ​​запись routeAfterAuthentication):

import { inject as service } from '@ember/service';
import { isNone } from '@ember/utils';
import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin';

export default Route.extend(ApplicationRouteMixin, {
  routeAfterAuthentication: 'index',
  currentUser: service(),
  session:  service(),
  beforeModel() {
    return this._loadCurrentUser();
  },

  sessionAuthenticated() {
    this._super(...arguments);
    this._loadCurrentUser();
  },

  _loadCurrentUser() {
    var currUser = this.currentUser;
    return isNone(currUser.get('user')) ? currUser.load() : currUser.reload();
  }
});

логин. js (все, что я здесь сделал была добавлена ​​запись routeIfAlreadyAuthenticated):

import UnauthenticatedRouteMixin  from 'ember-simple-auth/mixins/unauthenticated-route-mixin';

export default Route.extend(UnauthenticatedRouteMixin, {
  routeIfAlreadyAuthenticated: 'index'
});

Если я добавлю несколько точек останова в код миксина, я смогу увидеть, как последний оператор transitionTo запускается в файле application-route-mixin.js, указывая на желаемый маршрут. Я предполагаю, что это то, что я хочу, но, тем не менее, вскоре после того, как он попадает в этот код, происходит перезагрузка (вместо правильного входа в систему):

sessionAuthenticated() {
      const attemptedTransition = this.get('session.attemptedTransition');
      const cookies = Ember.getOwner(this).lookup('service:cookies');
      const redirectTarget = cookies.read('ember_simple_auth-redirectTarget');

      if (attemptedTransition) {
        attemptedTransition.retry();
        this.set('session.attemptedTransition', null);
      } else if (redirectTarget) {
        this.transitionTo(redirectTarget);
        cookies.clear('ember_simple_auth-redirectTarget');
      } else {
        this.transitionTo(this.get('routeAfterAuthentication'));
      }
    },
...