当前,我的Ember-cli应用程序在刷新后注销。为了让代码正常工作,我对代码做了很多修改,但没有人帮上忙。如果有必要,我将尝试与另一个提供程序实现身份验证。
我有一个应用程序的路由,它只是注销和登录的路由,它处理登录,因为客户端想要对其进行样式化。
我的config/environment.js . My文件如下所示:
firebase: 'https://<my-website-here>.firebaseio.com/',
torii: {
sessionServiceName: 'session'
},app/适配器/application.js:
import Ember from 'ember';
import FirebaseAdapter from 'emberfire/adapters/firebase';
const { inject } = Ember;
export default FirebaseAdapter.extend({
firebase: inject.service(),
});app/torii-适配器/application.js:
import Ember from 'ember';
import ToriiFirebaseAdapter from 'emberfire/torii-adapters/firebase';
export default ToriiFirebaseAdapter.extend({
firebase: Ember.inject.service()
});app/routes/application.js:
import Ember from 'ember';
export default Ember.Route.extend({
actions: {
logout: function() {
this.get('session').close().then(function() {
this.transitionTo('application');
}.bind(this));
}
}
});应用程序/路由/login.js:
import Ember from 'ember';
export default Ember.Route.extend({
actions: {
login: function() {
var controller = this.get('controller');
var email = controller.get('userEmail');
var password = controller.get('userPassword');
this.get('session').open('firebase', {
provider: 'password',
email: email,
password: password
}).then(function() {
this.transitionTo('dashboard');
}.bind(this));
}
}
});是的,目前,登录和注销都很好,但是我不能在会话中间刷新页面,否则它会自动注销我。
感谢任何人事先。
发布于 2016-02-20 11:41:16
Torii不为您保留身份验证会话。您需要自己在适配器的open、fetch和close挂钩中实现这一点。
最简单的方法是使用localStorage API。
获取
在fetch钩子中,您需要从localStorage中提取会话数据。如果那里什么都没有,要么抛出一个异常,要么返回一个将reject的承诺。
打开
您的适配器需要使用会话数据进行resolve,但也应该将其存储在localStorage中供以后的会话使用。
关
清除会话数据的localStorage键,并返回resolve承诺。
示例
下面是我的一个应用程序的应用程序适配器,它与Torii一起使用Slack。open钩子可能与您需要的Firebase不同,但希望这能给您提供一些可以使用的东西。
export default Ember.Object.extend({
storage: Ember.inject.service(),
fetch() {
let token = this.get('storage.token');
if (Ember.isEmpty(token)) {
throw new Error('No token in storage');
}
return Ember.RSVP.resolve({ token });
},
open(authentication) {
return new Ember.RSVP.Promise((resolve, reject) => {
Ember.$.ajax({
type: 'POST',
url: '/api/tokens',
data: authentication,
dataType: 'json',
success: Ember.run.bind(null, resolve),
failure: Ember.run.bind(null, reject)
});
}).then(data => {
let token = data.accessToken;
this.set('storage.token', token);
return { token };
});
},
close() {
this.set('storage.token', null);
return Ember.RSVP.resolve();
}
});发布于 2017-05-18 19:56:52
这里有个简单得多的方法。
app/routes/application.js:
import Ember from 'ember';
export default Ember.Route.extend({
beforeModel: function() {
return this.get('session').fetch().catch(function() {});
},
model() {
if(this.get('session.isAuthenticated')) {
return this.store.findAll('post');
} else {
this.transitionTo('login');
}
});关键是获取会话的beforeModel。
我在这里发现了一个小块:https://blog.isnorcreative.com/2016/07/30/ember-firebase.html
https://stackoverflow.com/questions/35516992
复制相似问题