ember.js 火基3.0 +灰烬2.0:Torii适配器必须实现'open'才能打开会话

tquggr8v  于 2022-11-05  发布在  其他
关注(0)|答案(3)|浏览(137)

我在使用torii适配器进行Facebook身份验证时遇到问题,错误如下:'Torii适配器必须实现open才能打开会话'。
我看过很多教程,也尝试过所有的方法,但是大多数都是旧的ember代码,没有一个看起来能真正工作。
当前状态:我能够登录,我得到Facebook弹出窗口,我可以授权。
使用fiddler,我还可以看到来自API的响应,其中包含一个JSON响应,其中包含我验证的用户的所有凭据。在firebase控制台中,我可以看到授权用户,重置其密码,拒绝访问...
所有这些都让我相信,这“仅仅”是一个前端问题,我似乎无法建立一个适当的“会话”来处理。
我的最终目标是收集相关的用户数据,并将其作为“用户”条目传输到我的firebase后端,允许网站访问者快速注册,但我会非常高兴有一个活跃的会话,这样我就可以自己解决剩下的问题。
作为一个前端新手(我通常编写C#),Ember可能不是最好的选择,但我现在已经走了这么远,我不打算让它全部滑下来,拿起一个不同的框架。
我的代码:
config/environment.js

firebase: {
    apiKey: 'xxxxxxx',
    authDomain: 'myappname.firebaseapp.com',
    databaseURL: 'https://myappname.firebaseio.com',
    storageBucket: 'myappname.appspot.com',
    messagingSenderId: '1234567890'
  },

    torii: {
      sessionServiceName: 'session'
    }

torii-adapters/application.js(我对它做了太多修改,甚至不记得原始代码是什么了,因为我在这里所做的任何修改/添加/删除似乎都没有任何作用。)

import Ember from 'ember';
import ToriiFirebaseAdapter from 'emberfire/torii-adapters/firebase';

export default ToriiFirebaseAdapter.extend({
  firebase: Ember.inject.service(),
});

routes/application.js

import Ember from 'ember';

export default Ember.Route.extend({
    beforeModel: function() {
    return this.get('session').fetch().catch(function() {
    });
  },

  actions:{

    login: function(provider) {
      this.get('session').open('firebase', {
        provider: provider,
      }).then(function(data) {
        console.log(data.currentUser);
      });
    },

    logout: function() {
      this.get('session').close().then(function() {
        this.transitionTo('application');
      }.bind(this));
    }
  }
});

application.hbs

<div class="container">
  {{partial 'navbar'}}
<a {{action "signIn" "facebook"}} class="btn">{{fa-icon "facebook"}}</a>
<a {{action "signIn" "twitter"}} class="btn">{{fa-icon "twitter"}}</a>
<a {{action "signIn" "github"}} class="btn">{{fa-icon "github"}}</a>
<a {{action "signIn" "google"}} class="btn">{{fa-icon "google"}}</a>
  {{outlet}}
</div>

编辑1

上面的代码在重新启动ember服务器后给了我更多的错误。这是我的麻烦的原因吗?所有看起来没有改变的改变,直到服务器重新启动后才注册?如果是这样的话,我可能已经通过了大约一百次正确的解决方案了...

编辑2

修改代码以反映实际问题。之前的代码被拧得无法测量,但我从来没有意识到这一点,因为它没有回升,直到服务器重新启动后。

EDIT 3找到并尝试了此方法,但没有效果:https://stackoverflow.com/a/32079863/4309050

yvgpqqbh

yvgpqqbh1#

这是Lorem Ipsum Dolor's answer,但针对Ember 3.16+进行了更新

// Inside routes/application.js
import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';

export default class ApplicationRoute Route {
  @service session;

  async beforeModel() {
    try {
      return this.session.fetch();
    } catch {}
  }
}

请注意,在Ember 3.16+中,不建议将操作添加到您的Route。相反,您可以将它们添加到Controller或Component上下文中:

import Component from '@glimmer/component';
import { inject as service } from '@ember/service';
import { action } from '@ember/object';

export default class LoginLogout extends Component {
  @service session;
  @service router;

  @action
  async login(provider)  {
    let data = await this.session.open('firebase', { provider });

    console.log(data.currentUser);
  }

  @action
  async logout() {
    await this.session.close();

    this.router.transitionTo('application');
  }
}

请注意添加了router service。路由器服务是我们在应用程序中与路由进行交互的方式。

import ToriiFirebaseAdapter from 'emberfire/torii-adapters/firebase';

export default class MyAdapter extends ToriiFirebaseAdapter {

}
h9vpoimq

h9vpoimq2#

我遇到了同样的问题,我注意到我的torii-adapters/application.js位于pods结构下(因为我使用它)。所以我把torii-adapters文件夹移到app文件夹,一切都开始工作了。

jrcvhitl

jrcvhitl3#

注:对于Ember 3.16+应用程序,以下是相同的代码,但更新了语法/模式:https://stackoverflow.com/a/62500685/356849
下面是Ember〈3.16的代码,尽管代码可以像3.16+一样完全向后兼容,但写旧代码并不总是很有趣。
尝试在应用程序路由中注入服务,并将beforeModel移到actions哈希之外,

// Inside routes/application.js

export default Ember.Route.extend({
  session: Ember.inject.service(), // (1)

  beforeModel: function() {
    return this.get('session').fetch().catch(function() {});
  },

  actions:{
    login: function(provider) {
      this.get('session').open('firebase', {
        provider: provider,
      }).then(function(data) {
        console.log(data.currentUser);
      });
    },

    logout: function() {
      this.get('session').close().then(function() {
        this.transitionTo('application');
      }.bind(this));
    }
  }
});

昨天我已经完成了同样的事情(Firebase Torii Auth),试着仔细按照指南操作。指南中唯一缺少的是手动注入session服务。
还记得您在environment.js文件中声明的session吗?您必须注入它才能使其可用

session: Ember.inject.service(), // (1)

https://github.com/firebase/emberfire/blob/master/docs/guide/authentication.md
在我的ToriiFirebaesAdapter中,

import ToriiFirebaseAdapter from 'emberfire/torii-adapters/firebase';

export default ToriiFirebaseAdapter.extend({
});

相关问题