2015-04-24 3 views
0

Я пытаюсь настроить аутентификатор, который будет действителен для многих поставщиков, потому что в бэкэнд я использую метод утверждения привратника, который обрабатывает весь поток.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 for Ember-simple-auth, Torii and 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/маркер: Перехожу к серверу следующее params: 1. grant_type = «утверждение» 2. поставщик 3. утверждение = «3dPartyToken»

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

ошибка: enter image description here

+0

Вы хотите обмениваться сторонним токеном с маркером своего пользовательского API? – kunerd

+0

@kunerd Полностью, в случае сторонней аутентификации/oauth/token должны быть получены следующие параметры (provider = "facebook" | "google", grant_type = "assertion" и assertion = "3dPartyToken") – Moh

+0

В этом случае вы должен подклассифицировать аутентификатор torii, переопределить метод «authenticate» и когда супер разрешит сделать запрос на ваш сервер обменять токен. – marcoow

ответ

1

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

+0

@macoow У меня на самом деле то же самое, но никакой запрос '/ oauth/token' не был отправлен на сервер после аутентификации facebook через torii. У меня теперь есть провайдер facebook-oauth2 и простой аутентификатор: torii, но не работает. я должен где-то потребовать тории? – Moh

+0

@macoow, я расширил 'simple-auth-torii/authenticators/torii' и переопределив метод' authenticate' и назвал 'this._super (поставщик, параметры)' сформировать мой новый класс.Но похоже, что суперкласс не может найти объект torii, и он дает мне ошибку 'Can not read property 'open' undefined'. как я могу расширить тории, чтобы переопределить метод аутентификации и как я могу получить экземпляр «torii» для моего нового класса для вызова таких методов, как «open»? – PIKP

0

В настоящее время я использую аналогичный подход, описанный в этом вопросе, но я впрыснуть 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); 
     }); 
     }); 
    }); 
    } 
+0

Мне нравится ваше решение, даже я не уверен, что было бы лучшей реализацией. не могли бы вы поместить некоторый код аутентификатора-torii-oauth2 ?! У меня не было способа справиться с открытым методом torii, для меня всегда кажется неопределенным. – Moh

Смежные вопросы