Пользовательский аутентификатор с простой аутентификацией Ember + интерфейс командной строки Ember

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

Я использую Ember CLI, поэтому в initializers/authentication.js у меня есть

import Ember from 'ember';

var customAuthenticator = Ember.SimpleAuth.Authenticators.Devise.extend({
  authenticate: function(credentials) {
    debugger;
  }
});

export default {
  name: 'authentication',

  initialize: function(container, application) {

    Ember.SimpleAuth.Session.reopen({
      user: function() {
        var userId = this.get('user_id');
        if (!Ember.isEmpty(userId)) {
          return container.lookup('store:main').find('user', userId);
        }
      }.property('userId')
    });

    // register the custom authenticator so the session can find it
    container.register('authenticator:custom', customAuthenticator);

    Ember.SimpleAuth.setup(container, application, {
      routeAfterAuthentication: 'landing-pages',
      authorizerFactory: 'ember-simple-auth-authorizer:devise'
    });
  }
};

При попытке авторизации получаю следующую ошибку:

TypeError: Cannot read property 'authenticate' of undefined
at __exports__.default.Ember.ObjectProxy.extend.authenticate

Есть идеи, почему?


person Sam Selikoff    schedule 20.06.2014    source источник


Ответы (3)


Начиная с Simple Auth 0.6.4, теперь вы можете сделать что-то вроде:

индекс.html:

window.ENV['simple-auth'] = {
  authorizer: 'simple-auth-authorizer:devise',
  session: 'session:withCurrentUser'
};

инициализаторы/настроить-session.js:

import Ember from 'ember';
import Session from 'simple-auth/session';

var SessionWithCurrentUser = Session.extend({
  currentUser: function() {
    var userId = this.get('user_id');
    if (!Ember.isEmpty(userId)) {
      return this.container.lookup('store:main').find('user', userId);
    }
  }.property('user_id')
});

export default {
  name: 'customize-session',
  initialize: function(container) {
    container.register('session:withCurrentUser', SessionWithCurrentUser);
  }
};
person michael    schedule 14.08.2014
comment
Именно так это делается в последних версиях ember-cli и simple-auth. Однако может быть более целесообразным связать ENV с MyAppENV. Итак, в вашем index.html: window.ENV = window.MyAppENV; (см.: stackoverflow.com/a/24845613/2637573). Затем в environtment.js добавьте это в ENV: 'simple-auth': { authorizer: 'simple-auth-authorizer:devise', session: 'session:withCurrentUser' } - person AWM; 19.08.2014
comment
С ember-cli 0.0.46 и simple-auth 0.6.7 вам больше не нужно включать window.ENV = window.MyAppENV; или что-то еще в index.html. - person AWM; 02.10.2014

Вам нужно будет сделать что-то вроде этого:

  Em.SimpleAuth.Authenticators.OAuth2.reopen
    serverTokenEndpoint: "http://myapp.com/token"
    authenticate: (credentials) ->
      new Em.RSVP.Promise (resolve, reject) =>
        data =
          grant_type: "password"
          username: credentials.identification
          password: credentials.password

        @makeRequest(data).then (response) =>
          # success call
        , (xhr, status, error) ->
          # fail call

Я думаю, что может произойти то, что вы регистрируете аутентификатор в приложении, а не в самом аутентификаторе?

person alvincrespo    schedule 20.06.2014
comment
Предполагается иметь .extend, а не .reopen, хотя кажется, что повторное открытие включенных аутентификаторов является краткосрочным решением. Спасибо! - person Sam Selikoff; 21.06.2014

Проблема в том, что сборка AMD в настоящее время не регистрирует автоматически компоненты библиотек расширений (см. https://github.com/simplabs/ember-simple-auth/issues/198). Я изменю это в следующем выпуске и, вероятно, также приму документацию, чтобы больше сосредоточиться на сборке AMD, а не на браузерной версии. На данный момент вам нужно запустить это в своем инициализаторе

container.register(
  'ember-simple-auth-authorizer:devise',
  Ember.SimpleAuth.Authorizers.Devise
);
container.register(
  'ember-simple-auth-authenticator:devise',
  Ember.SimpleAuth.Authenticators.Devise
);
person marcoow    schedule 20.06.2014
comment
Вы вставили строки перед вызовом Ember.SimpleAuth.setup? - person marcoow; 21.06.2014
comment
Я сделал это, хотя мне больше не нужен пользовательский аутентификатор. - person Sam Selikoff; 21.06.2014