Как пройти аутентификацию на Twitter с помощью Ember Torii и Ember Simple Auth - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь пройти аутентификацию на Twitter, используя Ember Torii и Ember Simple Auth.Однако я не уверен, как правильно закрыть всплывающее окно аутентификации после того, как пользователь прошел аутентификацию.Мой код:

//app/authenticators/torii.js
import {inject as service} from '@ember/service';
import Torii from 'ember-simple-auth/authenticators/torii';

export default Torii.extend({
  torii: service(),
  ajax: service(),

  authenticate() {
    const ajax = this.get('ajax');
    return this._super(...arguments).then((data) => {
      console.log('Authorization data:');
       console.log(data);
      if(data.provider === "twitter" && data.code) {
        return {
          accessToken: data.code,
          provider: data.provider
        };
      }
      //This is for OAuth2 providers e.g. Facebook
      return ajax.request(
        'http://localhost:8080/api/1/auth', {
        type: 'POST',
        dataType: 'json',
        crossDomain: true,
        contentType: 'application/json',
        data: {'provider': data.provider, 'authorizationCode': data.authorizationCode}
      }).then((response) => {
        return {
          accessToken: response.token,
          provider: data.provider
        };
      });
    });
  }
});


  //config/environment.js
  .......
  providers: {
    'facebook-oauth2': {
      apiKey: 'xxxxxxxxxxxxxx',
      scope: 'public_profile,email'
    },
    'twitter': {
      requestTokenUri: 'http://localhost:8080/api/1/auth/twitter/'
    },

//app/torii-providers/facebook-oauth2.js
import { computed } from '@ember/object';
import FacebookOauth2Provider from 'torii/providers/facebook-oauth2';

export default FacebookOauth2Provider.extend({
  redirectUri: computed(function() {
    return [
      window.location.protocol,
      '//',
      window.location.host,
      '/torii/redirect.html'
    ].join('');
}),

  fetch(data) {
    return data;
  }
});

Насколько я понимаю, в случае аутентификации с использованием Twitter происходит следующее:

  1. Пользователь нажимает на элемент пользовательского интерфейса, чтобы инициировать поток аутентификации.Ember Torii создает всплывающее окно и выполняет запрос GET на requestTokenUri.Бэкэнд API генерирует oauth_token, требуемый Twitter, и перенаправляет на страницу входа в Twitter с параметром запроса oauth_token.
  2. Пользователь входит в систему. В случае успешного входа Twitter затем перенаправляет всплывающее окно браузера нанастроенный Callback URL на бэкэнде API вместе с параметрами oauth_token и oauth_verifier.
  3. API-интерфейсы внутреннего интерфейса Callback URL получают эти параметры и обменивают их на oauth_token и oauth_token_secret, которыехранится в бэкэнде.

Мой вопрос в основном, что происходит дальше и как правильно и безопасно закрыть всплывающее окно и инициализировать сеанс:

Мой бэкэндпреобразует токен, сгенерированный в 3 выше, во внутренний токен JWT и перенаправляет всплывающее окно браузера на torii/redirect.html?code=<<JWTTOKEN>>.Однако, когда всплывающее окно браузера закрывается, Torii пытается повторно аутентифицировать данный токен, вызывая метод authenticate, который не требуется.Я использовал обходной путь, как показано выше в app/authenticators/torii.js.Это правильно?Есть ли лучший способ?

...