Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 3.0+;Ember 2.0:Tori适配器必须实现“打开”,才能打开会话_Firebase_Ember.js_Authorization_Firebase Authentication_Torii - Fatal编程技术网

Firebase 3.0+;Ember 2.0:Tori适配器必须实现“打开”,才能打开会话

Firebase 3.0+;Ember 2.0:Tori适配器必须实现“打开”,才能打开会话,firebase,ember.js,authorization,firebase-authentication,torii,Firebase,Ember.js,Authorization,Firebase Authentication,Torii,我对Tori适配器的facebook身份验证有问题,错误是:“Tori适配器必须实现open才能打开会话” 我访问了许多教程,并尝试了所有介绍的方法,但大多数都是旧的余烬代码,似乎没有一个真正起作用 当前状态:我可以登录,我得到facebook弹出窗口,我可以授权 使用fiddler,我还可以看到来自API的响应,该API包含一个JSON响应,其中包含来自我进行身份验证的用户的所有凭据。 在firebase控制台中,我可以看到授权用户,重置其密码,拒绝访问 所有这些让我相信,这只是一个前端问题,

我对Tori适配器的facebook身份验证有问题,错误是:“Tori适配器必须实现
open
才能打开会话”

我访问了许多教程,并尝试了所有介绍的方法,但大多数都是旧的余烬代码,似乎没有一个真正起作用

当前状态:我可以登录,我得到facebook弹出窗口,我可以授权

使用fiddler,我还可以看到来自API的响应,该API包含一个JSON响应,其中包含来自我进行身份验证的用户的所有凭据。 在firebase控制台中,我可以看到授权用户,重置其密码,拒绝访问

所有这些让我相信,这只是一个前端问题,我似乎无法建立一个适当的“会议”来处理

我的最终目标是获取相关的用户数据,并将其作为“用户”条目传输到我的firebase后端,允许快速注册网站访问者,但我非常高兴有一个活动会话,以便我可以自己解决其余的问题

作为一名前端新手(我通常编写C#),余烬可能不是获得挂起它的最佳选择,但我现在已经走到了这一步,我不打算让所有的东西都溜走,选择一个不同的框架

我的代码:

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(我对它做了太多的更改,我甚至记不起原始代码是什么,因为我在这里更改/添加/删除的内容似乎都不起任何作用。)

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>

{{partial'navbar'}}

注意:对于Ember 3.16+应用程序,以下是相同的代码,但具有更新的语法/模式:

下面是针对Ember<3.16的,尽管代码可以作为3.16+完全向后兼容,但编写旧代码并不总是有趣的


尝试在应用程序路由内注入服务,并将
beforeModel
移动到
操作
散列之外

// 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),请仔细阅读指南。指南中唯一缺少的是手动注入
会话
服务

还记得您在
environment.js
文件中声明的
会话吗?您必须将其注入以使其可用

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

在我的TorifirebeAdapter里

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

export default ToriiFirebaseAdapter.extend({
});

我也有同样的问题,我注意到我的
torii adapters/application.js
位于
pods
结构下(因为我使用它)。因此,我将
torii adapters
文件夹移动到
app
文件夹中,一切都开始工作。

这是,但已针对Ember 3.16进行了更新+


请注意,在Ember 3.16+中,不建议向路线添加操作。 相反,您可以将它们添加到控制器或组件上下文:

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');
  }
}
注意添加了。路由器服务是我们与应用程序中任何位置的路由进行交互的方式

import ToriiFirebaseAdapter from 'emberfire/torii-adapters/firebase';
    
export default class MyAdapter extends ToriiFirebaseAdapter {

}

这种做法是有道理的。我要试一试,让你知道!老实说,对于ember应用程序的身份验证,ember simple auth是一个更好的选择。但是您需要实现自己的适配器,即使在将会话注入application.js之后,我也会遇到同样的错误。我在另一台机器上,从零开始使用早期提交的身份验证代码,我想我必须用简单的auth编写自己的适配器。Ember上的文档真的很差,这太糟糕了,尽管如此,我还是喜欢它。有什么错误吗?您能否尝试将会话对象记录在beforeModel
hook中?您的前端依赖性是什么?“Tori适配器必须实现
open
才能打开会话”。与上面相同的代码,在ForeModel退出操作并添加注入之前不是我的项目中的情况,没有pod结构,而是经典的布局。我还没有重新讨论这个问题,我切换到Auth0,它就像一个魔咒,开箱即用。:)这是罕见的,你找到最新的余烬代码,这使得它很难,如果你来的余烬如此荣誉的更高版本。非常感谢。
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');
  }
}
import ToriiFirebaseAdapter from 'emberfire/torii-adapters/firebase';
    
export default class MyAdapter extends ToriiFirebaseAdapter {

}