Ember Simple Auth — Пользовательский авторизатор прерывает аутентификацию

Я использую аддон ember-cli-simple-auth с Torii для аутентификации.

До сих пор мне удавалось заставить работать аутентификацию, используя как пользовательский провайдер Torii, так и пользовательский Simple Authenticator.

Теперь я хотел бы использовать пользовательский Simple Auth Authorizer для внедрения токена доступа в запросы.

Следуя документации https://github.com/simplabs/ember-simple-auth#implementing-a-custom-authorizer Я добавил пользовательский авторизатор и инициализатор

authorizers/myservice.js

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

export default Base.extend({
  /**
    @method authorize
    @param {jqXHR} jqXHR The XHR request to authorize (see http://api.jquery.com/jQuery.ajax/#jqXHR)
    @param {Object} requestOptions The options as provided to the `$.ajax` method (see http://api.jquery.com/jQuery.ajaxPrefilter/)
  */
  authorize: function(jqXHR) {
    var accessToken = this.get('session.content.token');
    if (this.get('session.isAuthenticated') && !Ember.isEmpty(accessToken)) {
      jqXHR.setRequestHeader('Authorization', 'Bearer ' + accessToken);
    }
  }
});

initializers/authorization.js

import MyserviceAuthorizer from '../authorizers/myservice';

export function initialize(container, application) {
  container.register('authorizer:myservice', MyserviceAuthorizer);
}

export default {
  name: 'authorization',
  before: 'simple-auth',
  initialize: initialize
};

& включен в config/environment.jsсреду разработки

ENV['simple-auth'] = {
  authorizer: 'authorizer:myservice',
  crossOriginWhitelist: ['*']
}

К сожалению, добавив это, он нарушил аутентификацию.

Похоже, Тори больше не получает ответа.

The response from the provider is missing these required response params: access_token, token_type, expires_in

Я также включил сюда код поставщика Torii и код Simple Authenticator.

Любые предложения или помощь будут очень признательны, я немного застрял с этим.

torii-providers/myservice.js

import Provider from 'torii/providers/oauth2-bearer';
import {configurable} from 'torii/configuration';
import env from '../config/environment';

export default Provider.extend({
  name: 'myservice',
  baseUrl: (env.api_host + '/oauth/authorize'),

  responseParams: ['access_token', 'token_type', 'expires_in'],

  redirectUri: configurable('redirectUri', function(){
    // A hack that allows redirectUri to be configurable
    // but default to the superclass
    return this._super();
  })
});

И пользовательский аутентификатор Simple Auth

authenticators/myservice.js

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

export default Base.extend({
  restore: function(data) {
    return new Ember.RSVP.Promise(function(resolve, reject) {
      if(!Ember.isEmpty(data.currentUser)) {
        resolve(data);
      } else {
        reject();
      }
    });
  },

  authenticate: function(options) {
    return this.fetchOauthData(options).then(this.fetchUserData.bind(this));
  },

  fetchUserData: function(oauthData) {
    var token = oauthData.token.access_token;
    return ajax({
        url: '/api/v1/users/me',
        type: "GET",
        beforeSend: function (xhr) {
          xhr.setRequestHeader("Authorization", "Bearer " + token);
        }
    }).then(function(userJSON){
      return {
        currentUser: userJSON.user,
        token: token
      };
    });
  },

  fetchOauthData: function(options) {
    return new Ember.RSVP.Promise(function(resolve, reject) {
      options.torii.open(options.provider).then(function(oauthData) {
        resolve({
          provider: oauthData.provider,
          token: oauthData.authorizationToken
        });
      }, function(error) {
        reject(error);
      });
    });
  }
});

person Chris    schedule 17.11.2014    source источник


Ответы (1)


Это может быть связано с тем, что Ember CLI автоматически регистрирует все в папке приложения в контейнере. Хотя следующая цитата из документации Ember CLI не объясняет это ясно, но дает Намек:

Все модули в папке приложения могут быть загружены преобразователем, но обычно такие классы, как миксины и утилиты, следует загружать вручную с помощью оператора импорта.

Если ваш файл авторизатора app/authorizers/myservice.js, Ember CLI зарегистрирует его под именем 'authorizer:myservice' в контейнере. Контейнер, в свою очередь, создаст экземпляр singleton при поиске. Поскольку вы делаете ту же регистрацию в инициализаторе, может возникнуть какой-то конфликт.

person snovity    schedule 19.11.2014
comment
Все еще пытаюсь добраться до сути этого, но большое спасибо за понимание snovity. - person Chris; 23.11.2014
comment
Это правильный ответ, см. эту проблему github: github.com/stefanpenner/ember-cli /issues/2145 — происходит то, что, используя правильное соглашение об именах, преобразователь автоматически регистрирует их в контейнере. Спасибо сновити! - person Chris; 24.11.2014
comment
Крис, этот выпуск GitHub — отличная находка! В настоящее время документация просто не объясняет это достаточно хорошо. - person snovity; 24.11.2014
comment
Спасибо - также, хотя документы Ember CLI еще не обновлены, Ember Simple Auth уже был. Теперь это не должно быть проблемой :) простая-авторизация/фиксация/ - person Chris; 25.11.2014