РЕДАКТИРОВАТЬ: Добавлены детали в первые 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'));
}
},