Ember simple auth Session не аутентифицируется после вызова resolve в пользовательском аутентификаторе

Мои аутентификаторы / custom.js:

import Ember from 'ember';
import Base from 'simple-auth/authenticators/base';

export default Base.extend({
  restore: function(data) {

  },
  authenticate: function(email, password, authenticateCallback) {
    return new Ember.RSVP.Promise((resolve, reject) => {
      Ember.$.ajax({
        type: 'POST',
        url: apiOrigin + '/api/v1/login',
        data: {
          email: email,
          password: password
        },
        dataType: 'json'
      }).then(function(userData){
        console.log('login post success', userData)
        authenticateCallback(userData)
        Ember.run(function() {
          resolve(userData.uuid)
        })
      })['catch'](function(main){
        alert('login error ' + JSON.stringify(main))
        console.error('\'caught\' error from login post request', arguments);
      })
    })
  },
  invalidate: function(data) {

  }
});

И войдите в / controller.js:

import Ember from 'ember';

export default Ember.Controller.extend({
  session: Ember.inject.service('session'),
  application: Ember.inject.controller(),
  actions: {
    authenticate() {
      let { identification, password } = this.getProperties('identification', 'password');
      this.get('session').authenticate('authenticator:custom', identification, password, (userData) => {
        //TODO set these properties on ember-simple-auth's session object instead of application controller
        this.get('application').setProperties(userData)
        this.transitionToRoute('associate-device')
      }).catch((reason) => {
        this.set('errorMessage', reason.error);
      })
    }
  }
});

Мой маршрут ассоциированного устройства - это AuthenticatedRoute. Я не получаю сообщения об ошибке, но вместо этого последнее, что выводится на консоль, - это «Подготовка к переходу от логина к ассоциированному устройству».

По сути, ember simple auth документы здесь http://ember-simple-auth.com/api/classes/BaseAuthenticator.html#method_authenticate, что "выполнение обещания приведет к тому, что сеанс будет аутентифицирован. Любые данные, с которыми разрешается обещание, будут сохранены и доступны через свойство data.authenticated службы сеанса (см. data). Отклонение обещания указывает на то, что аутентификация не удалась, и в результате сеанс останется неаутентифицированным ". Однако мой сеанс, похоже, не прошел аутентификацию после того, как я успешно выполнил свое обещание.


person Devin Rhode    schedule 12.11.2015    source источник
comment
пока выглядит правильно, вам следует также реализовать метод restore аутентификатора, чтобы убедиться, что проблема не связана с тем, что он не реализован.   -  person marcoow    schedule 12.11.2015
comment
Я искал источник theAuthenticator.authenticate.apply (theAuthenticator и теперь возился с массивными assets / dist / vendor.js, и я вижу, что по какой-то причине обратный вызов .then в строке 21 не вызывается .. githabblos-emberpl.com/amberpl /   -  person Devin Rhode    schedule 12.11.2015
comment
Поместите это в метод восстановления, и на самом деле он не будет вызван: alert ('restore'); вернуть новый Ember.RSVP.Promise ((resolve, reject) = ›{resolve ('foo')})   -  person Devin Rhode    schedule 12.11.2015
comment
Но я удалил свою обертку обещания и вместо этого возвращаю обещание ajax, и это работает. Думаю, я не знаю, как использовать обещания?   -  person Devin Rhode    schedule 12.11.2015
comment
Так что на самом деле мои аутентификаторы отклоняют обратный вызов, который каким-то образом вызывается. theAuthenticators.authenticate (.....). then (resolve function, reject callback вызывается Может быть, ошибка связана с какой-то отсутствующей конфигурацией?   -  person Devin Rhode    schedule 12.11.2015


Ответы (1)


$.ajax не имеет метода перехвата. Это исключение было скрыто, потому что я копировал документацию для написания пользовательских аутентификаторов. Чтобы выявить любые исключения, возникающие в вашем методе аутентификации пользовательских аутентификаторов, вам, вероятно, следует console.log сделать это так:

// app/controllers/login.js
import Ember from 'ember';

export default Ember.Controller.extend({
  session: Ember.inject.service('session'),

  actions: {
    authenticate() {
      let { identification, password } = this.getProperties('identification', 'password');
      this.get('session').authenticate('authenticator:oauth2', identification, password).catch((reason) => {
        // **CHANGE THE BELOW LINE**
        console.error('exception in your authenticators authenticate method', reason)
      });
    }
  }
});
person Devin Rhode    schedule 12.11.2015
comment
Session.authenticate возврат отклоняющего обещания не означает, что в вашем аутентификаторе было исключение. Это также может означать, что аутентификатор отклоняет аутентификацию, потому что учетные данные недействительны. - person marcoow; 13.11.2015
comment
Возможно, следует изменить RSVP.js, чтобы отправлять исключения в window.onerror или, по крайней мере, по-другому обрабатывать фактические ошибки программиста? - person Devin Rhode; 14.11.2015
comment
ember simple auth выполняет theAuthenticator.authenticate.apply (theAuthenticator, args) .then (... функция успеха ..., ... функция отклонения ...). Метод аутентификации возвращает обещание, а RSVP вызывает предоставленную функцию для обещания. Функция, предоставленная RSVP, создает исключение, поэтому RSVP решает вызвать функцию отклонения. На основе этой темы: github.com/tildeio/rsvp.js/issues/196 Я думаю, что есть способ зарегистрировать такие типы ошибок .. - person Devin Rhode; 14.11.2015