2

我有一个 Torii 适配器,它将我的 Facebook 和 Twitter 授权令牌发布回我的 API 以建立会话。在open()我的适配器的方法中,我想知道提供者的名称,以便围绕如何处理不同类型的提供者编写一些逻辑。例如:

// app/torii-adapters/application.js
export default Ember.Object.extend({
  open(authorization) {
    if (this.provider.name === 'facebook-connect') {
      var provider = 'facebook';
      // Facebook specific logic
      var data = { ... };
    }
    else if (this.provider.name === 'twitter-oauth2') {
      var provider = 'twitter';
      // Twitter specific logic
      var data = { ... };
    }
    else {
      throw new Error(`Unable to handle unknown provider: ${this.provider.name}`);
    }

    return POST(`/api/auth/${provider}`, data);
  }
}

但是,当然,this.provider.name这是不正确的。有没有办法从适配器方法中获取使用的提供者的名称?提前致谢。

更新:我认为有几种方法可以做到这一点。第一种方法是在调用之前在 localStorage(或 sessionStorage)中设置提供者名称open(),然后在上述逻辑中使用该值。例如:

localStorage.setItem('providerName', 'facebook-connect');
this.get('session').open('facebook-connect');

// later ...

const providerName = localStorage.getItem('providerName');
if (providerName === 'facebook-connect') {
  // ...
}

另一种方法是为不同的提供者创建单独的适配器。app-name/torii-adapters/facebook-connect.jsTorii 中有代码可以在重新使用之前查找,例如app-name/torii-adapters/application.js。我会将特定于提供程序的逻辑放在单独的文件中,这样就可以了。但是,我有存储、获取和关闭会话的通用逻辑,所以我现在不确定该放在哪里。

更新 2: Torii 无法在 torii-adapter 下找到不同的适配器(例如 facebook-connect.js、twitter-oauth2.js)。我试图为所有包含通用功能的适配器创建一个父类。回到绘图板...

更新 3:正如@Brou 指出的那样,正如我在与 Torii 团队的交谈中了解到的那样,无论提供者如何,都可以在一个通用的应用程序适配器 ( app-name/torii-adapters/application.js) 文件中完成获取和关闭会话。如果您需要特定于提供者的会话打开逻辑,您可以拥有多个附加适配器(例如app-name/torii-adapters/facebook-oauth2.js),这些适配器可能是应用程序适配器的子类(或不是)。

关于 Torii 中的会话生命周期:https ://github.com/Vestorly/torii/issues/219

关于多适配器模式:https ://github.com/Vestorly/torii/issues/221

关于authenticatedRoute()Torii 0.6.0 中的新 DSL 和自动会话获取:https ://github.com/Vestorly/torii/issues/222

更新 4:我已经在我的个人网站上写下了我的发现和解决方案。它封装了我原来的帖子、@brou 和其他来源的一些想法。如果您有任何问题,请在评论中告诉我。谢谢你。

4

1 回答 1

1

我不是专家,但我在过去几周学习了两次simple-authtorii首先,我意识到我需要同时升级太多东西,最终延迟了我的登录功能。今天,我回来工作一周。

我的问题是:你的具体逻辑是什么?

我还在实施与提供者无关的处理和后来的通用处理。

这是我开始实施的过程:

  1. 用户认证
    基本上,调用torii默认提供程序来获取该 OAuth2 令牌。
  2. 用户信息检索
    从 FB/GG/LI API 获取规范信息,以便为跨不同提供商的单个用户创建尽可能少的会话。因此,这与 API 无关。
    然后我会这样做:自定义子提供商调用this._super(),然后进行此检索。
  3. 通过我的 API获取用户会话或会话更新。
    使用以前的规范用户信息。对于任何提供者都应该是相同的。
    然后我会这样做:单个 ( application.js) 鸟居适配器。
  4. 针对页面刷新的用户会话持久性。
    从理论上讲,使用simple-auth的会话实现就足够了。

也许我们的作品之间唯一的区别是我暂时不需要任何授权人,因为我的后端还没有安全(我仍然在本地运行)。

我们可以保持联系,了解我们各自的进度:这是我的一周任务,所以不要犹豫!
我正在使用 ember 1.13

希望它有所帮助,
享受编码!8-)

于 2015-09-09T09:04:49.663 回答