作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 torii 适配器进行 facebook 身份验证时遇到问题,错误是:“Torii 适配器必须实现 open
才能打开 session ”。
我访问了许多教程,并尝试了所有介绍的方法,但其中大多数通常是旧的 ember 代码,而且似乎没有一个真正起作用。
当前状态:我能够登录,我得到 facebook 弹出窗口并且我可以授权。
使用 fiddler,我还可以看到来自 API 的响应,其中包含一个 JSON 响应,其中包含来自我进行身份验证的用户的所有凭据。
在 Firebase 控制台中,我可以看到授权用户、重置其密码、拒绝访问、...
所有这一切让我相信这“仅仅是”一个前端问题,我似乎无法建立一个适当的“ session ”来处理。
我的最终目标是获取相关的用户数据并将其作为“用户”条目传输到我的 Firebase 后端,从而允许网站访问者快速注册,但我会非常高兴有一个活跃的 session ,这样我就可以剩下的我自己解决。
作为一个前端菜鸟(我通常编写 C# 代码),Ember 可能不是掌握它的最佳选择,但我已经到此为止了,我不打算让它全部滑落并拿起一个不同的框架。
我的代码:
配置/环境.js
firebase: {
apiKey: 'xxxxxxx',
authDomain: 'myappname.firebaseapp.com',
databaseURL: 'https://myappname.firebaseio.com',
storageBucket: 'myappname.appspot.com',
messagingSenderId: '1234567890'
},
torii: {
sessionServiceName: 'session'
}
import Ember from 'ember';
import ToriiFirebaseAdapter from 'emberfire/torii-adapters/firebase';
export default ToriiFirebaseAdapter.extend({
firebase: Ember.inject.service(),
});
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));
}
}
});
<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>
最佳答案
这是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 添加操作。
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 . Router 服务是我们在应用程序中与路由交互的方式。
import ToriiFirebaseAdapter from 'emberfire/torii-adapters/firebase';
export default class MyAdapter extends ToriiFirebaseAdapter {
}
关于Firebase 3.0 + Ember 2.0 : The Torii adapter must implement `open` for a session to be opened,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43139836/
我是一名优秀的程序员,十分优秀!