EAK и пользовательский аутентификатор ember-simple-auth

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

По какой-то причине метод восстановления никогда не вызывается при перезагрузке страницы... или вообще. Я не знаю, проблема ли это в EAK, ESA или в чем-то еще, что я делаю неправильно.

var customAuthenticator =  Ember.SimpleAuth.Authenticators.Base.extend({
    resourceName: 'user',
    identifierField: 'email',
    restore: function (data) {
        console.log('Attempt to restore -> ', data);
        return new Ember.RSVP.Promise(function (resolve, reject) {
            resolve(data);
        });
    },
    authenticate: function (credentials) {
        var self = this;
        return new Ember.RSVP.Promise(function (resolve, reject) {
            var idObject = {};
            idObject[self.identifierField] = credentials.identification;

            self.get('store').find(self.resourceName, idObject).then(function (user) {
                var dataId;
                if(user.get('content').length) {
                    dataId = user.get('content').objectAt(0).get('data').id;
                    resolve({userId: dataId});
                } else {
                    reject();
                }
            });
        });
    },
    invalidate: function () {
        console.log('Attempt to invalidate');
        return new Ember.RSVP.Promise(function (resolve, reject) {
            resolve();
        });
    }
});

export default {
    name: 'authentication',
    initialize: function (container, application) {
        Ember.SimpleAuth.Session.reopen({
            user: function() {
                if (!Ember.isEmpty(this.get('userId'))) {
                    return container.lookup('store:main').find('user', +this.get('userId'));
                }
            }.property('userId')
        });
        container.register('authenticator:custom', customAuthenticator);
        container.injection('authenticator:custom', 'store', 'store:main');
        Ember.SimpleAuth.setup(container, application);
    }
};

Любые идеи будут оценены!

Изменить:

Вот содержимое локального хранилища после первоначальной аутентификации:

введите здесь описание изображения

Изменить: снимок локальной области действия после точки останова.

введите здесь описание изображения

Изменить: добавлено несколько строк отладки в метод восстановления.

restore: function() {
    var _this = this;
    return new Ember.RSVP.Promise(function(resolve, reject) {
      var restoredContent      = _this.store.restore();
      var authenticatorFactory = restoredContent.authenticatorFactory;
      if (!!authenticatorFactory) {
        console.log('Log 1');
        delete restoredContent.authenticatorFactory;
        console.log('Log 2');
        _this.container.lookup(authenticatorFactory).restore(restoredContent).then(function(content) {
          console.log('Log 3');
          _this.setup(authenticatorFactory, content);
          resolve();
        }, function() {
          _this.store.clear();
          reject();
        });
      } else {
        _this.store.clear();
        reject();
      }
    });
  },

Строка «Журнал 3» никогда не достигается. Я также пытался вручную выполнить _this.container.lookup('authenticator:custom'), что, казалось, приводило к тому, что любые строки за ним не были достигнуты. Так что, похоже, есть проблема с поиском.

Изменить: когда строка container.injection('authenticator:custom', 'store', 'store:main') удаляется из инициализатора, вызывается метод восстановления. Очевидно, что без хранилища аутентификатор не очень полезен, поэтому может потребоваться другой метод обработки.

И еще: похоже, что эта проблема возникает из-за любого внедрения в аутентификатор, а не только из магазина.


person Alex    schedule 28.05.2014    source источник
comment
Можете ли вы проверить, что находится в хранилище (локальном хранилище) после аутентификации сеанса?   -  person marcoow    schedule 11.06.2014
comment
@marcoow я добавил фото магазина в основной пост   -  person Alex    schedule 11.06.2014
comment
можете ли вы установить точку останова здесь github.com/simplabs/ember-simple-auth/blob/master/packages/ и проверить, что происходит?   -  person marcoow    schedule 11.06.2014
comment
@marcoow Что ж, похоже, в магазине все еще есть те же пары KV в этой точке останова (или в строке после точки останова), а в объекте restoreContent присутствуют authenticationFactory и userId. Добавлю скриншот для безопасности.   -  person Alex    schedule 11.06.2014
comment
Так вызывает ли он тогда метод аутентификатора restore? Id authenticatorFactory присутствует, он должен быть на самом деле.   -  person marcoow    schedule 11.06.2014
comment
@marcoow Нет. У меня установлена ​​точка останова, а также оператор console.log, и ни один из них не запускается.   -  person Alex    schedule 11.06.2014
comment
Можете ли вы немного отладить и узнать, что он на самом деле вызывает? Конечно, самым интересным было бы то, каков результат _this.container.lookup(authenticatorFactory) (должен быть экземпляр вашего аутентификатора).   -  person marcoow    schedule 11.06.2014
comment
@marcoow Конечно. Доложит.   -  person Alex    schedule 11.06.2014
comment
@marcoow Обновил исходный пост. Похоже, поиск аутентификатора вызывает проблему.   -  person Alex    schedule 11.06.2014
comment
Дальнейшее расследование показывает, что причиной проблемы является внедрение хранилища в аутентификатор.   -  person Alex    schedule 11.06.2014


Ответы (2)


Проблема заключалась в том, что я пытался внедрить зависимость до того, как вызвал метод Ember.SimpleAuth.setup(container, application). Вот работающий код инициализатора:

export default {
name: 'authentication',
initialize: function (container, application) {
    Ember.SimpleAuth.Session.reopen({
        user: function() {
            if (!Ember.isEmpty(this.get('userId'))) {
                return container.lookup('store:main').find('user', +this.get('userId'));
            }
        }.property('userId')
    });
    container.register('authenticator:custom', customAuthenticator);
    Ember.SimpleAuth.setup(container, application);
    container.injection('authenticator:custom', 'store', 'store:main');
    }
};
person Alex    schedule 11.06.2014

Все, что вам нужно сделать, это зарегистрировать свой собственный аутентификатор перед простой аутентификацией.

По сути, в ваш экспортируемый объект добавьте before: 'simple-auth'

person George    schedule 23.11.2014