我正在尝试使用Ember Torii和Ember Simple Auth对Twitter进行身份验证 . 但是,一旦用户通过身份验证,我不确定如何正确关闭身份验证弹出窗口 . 我的代码:

//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进行身份验证时会发生以下情况:

  • 用户单击UI元素以启动身份验证流程 . Ember Torii创建一个弹出窗口并向 requestTokenUri 发出GET请求 . API后端生成Twitter所需的 oauth_token ,并使用 oauth_token 作为查询参数重定向到Twitter登录页面 .

  • 用户登录 . 假设登录成功,Twitter随后将浏览器弹出窗口重定向到API后端的已配置 Callback URL 以及 oauth_tokenoauth_verifier 参数 .

  • 后端API的 Callback URL 接收这些参数,并为存储在后端的 oauth_tokenoauth_token_secret 交换这些参数 .

我的问题基本上是,接下来会发生什么以及如何干净安全地关闭弹出窗口并初始化会话:

我的后端将上面3中生成的令牌转换为内部JWT令牌,并将浏览器弹出窗口重定向到 torii/redirect.html?code=<<JWTTOKEN>> . 但是,当浏览器弹出窗口关闭时,Torii会尝试通过调用authenticate方法重新验证给定的令牌,这不是必需的 . 我在 app/authenticators/torii.js 中显示了上面显示的解决方法 . 它是否正确?有没有更好的办法?