Firebase 3.0+;Ember 2.0:Tori适配器必须实现“打开”,才能打开会话
我对Tori适配器的facebook身份验证有问题,错误是:“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控制台中,我可以看到授权用户,重置其密码,拒绝访问 所有这些让我相信,这只是一个前端问题,
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 {
}