ember-cli torii и несколько провайдеров

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

Я установил:

* "ember-cli-simple-auth": "0.8.0-beta.1"
* "ember-cli-simple-auth-oauth2": "^0.8.0-beta.2"
* "ember-cli-simple-auth-torii": "^0.8.0-beta.2"
* "torii": "^0.3.4"

Я искал эту проблему Workflow для Ember-simple-auth, Torii и Facebook Oauth2, чтобы я мог написать это:

# templates/login
<a {{action 'oauth2Authenticate' 'facebook-oauth2'}}>Login with facebook</a>
<a {{action 'oauth2Authenticate' 'google-oauth2'}}>Login with google</a>

# controllers/login
actions: {
  oauth2Authenticate: function(provider) {
    this.get('session').authenticate('authenticator:oauth2', { torii: this.get('torii'), provider: provider });
  }
}

# initializers/authentication
import Oauth2Authenticator from '../authenticators/oauth2';
export function initialize(container) {
  container.register('authenticator:oauth2', Oauth2Authenticator);
}
export default {
  name: 'authentication',
  initialize: initialize
};

# authenticators/oauth2
import Ember from 'ember';
import OAuth2 from 'simple-auth-oauth2/authenticators/oauth2';

export default OAuth2.extend({  
  authenticate: function(options) {
    var self = this;
    console.log(options.provider);
    return new Ember.RSVP.Promise(function(resolve, reject) {
      options.torii.open(options.provider).then(function(data) {
        var data = {
          grant_type: 'assertion',
          provider: options.provider,
          assertion: data.authorizationCode         
        };
        self.makeRequest(self.serverTokenEndpoint, data).then(function(response) {
          Ember.run(function() {
            var expiresAt = self.absolutizeExpirationTime(response.expires_in);
            self.scheduleAccessTokenRefresh(response.expires_in, expiresAt, response.refresh_token);
            resolve(Ember.$.extend(response, { expires_at: expiresAt }));
          });
        }, function(xhr, status, error) {
          Ember.run(function() {
            reject(xhr.responseJSON || xhr.responseText);
          });
        });
      }, reject);
    });
  }
});

# config/environment
ENV['simple-auth'] = {
  authorizer: 'simple-auth-authorizer:oauth2-bearer',
  crossOriginWhitelist: ['*']
};

ENV['simple-auth-oauth2'] = {
  serverTokenEndpoint: ENV.host + '/oauth/token',
  refreshAccessTokens: true
};

ENV['torii'] = {
  providers: {
    'facebook-oauth2': {
      apiKey:      '631252926924840',
      redirectUri: 'http://localhost:4200'
    }, 
    'google-oauth2': {
      apiKey:      '631252926924840',
      redirectUri: 'http://localhost:4200'
    }
  }
};
  • POST / oauth / token: я передаю серверу следующие параметры: 1. grant_type="assertion" 2. provider 3. assertion="3dPartyToken"

Я не уверен, что это лучший способ для моих требований, сейчас у меня проблема в том, что я не могу запустить открытый метод тории, кто-нибудь знает, что я делаю неправильно? Если у вас есть лучшее решение этой проблемы, будет очень признателен.

ошибка:

2 ответа

Не следует расширять аутентификатор OAuth 2.0 для аутентификации с помощью torii, поскольку OAuth 2.0 и torii сильно отличаются от точки зрения Ember Simple Auth, хотя большинство поставщиков torii подключаются к бэкэндам OAuth 2.0. Просто используйте аутентификатор torii и передайте провайдера torii, который вы хотите использовать в качестве второго аргумента, Session.authenticate, Посмотрите этот пример, чтобы понять, как это работает.

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

export default {
  name: 'custom-torii-oauth2-config',
  before: 'simple-auth',
  after: 'torii',

  initialize: function(container, application) {
    application.inject('authenticator:custom-torii-oauth2', 'torii', 'torii:main');
  }
};

После этого его можно использовать в аутентификаторе следующим образом:

this.torii.open(...)

Я также подумал о решении marcoow, упомянутом в его комментарии, но для меня это приводит к значительному дублированию кода с oauth2-authenticator, Не будет ли расширение для torii-authenticator быть хорошим, который обрабатывает именно этот поток?

Редактировать Важную часть custom-torii-oauth2 аутентификатор.

  fetchOauthData: function(options) {
    var _this = this;
    return new Ember.RSVP.Promise(function(resolve, reject) {
      _this.torii.open(options.provider).then(function(oauthData) {
        Ember.run(function() {
          resolve({
            grant_type: 'authorization_code',
            provider: oauthData.provider,
            code: oauthData.authorizationCode,
          });
        });
      }, function(error) {
        Ember.run(function() {
          reject(error);
        });
      });
    });
  }
Другие вопросы по тегам