目前,我的Ember-cli应用程序在刷新后注销。我已经改变了我的代码以试图让它工作,但没有人帮助。如有必要,我将尝试与其他提供商实施身份验证。
我有一个应用程序路由,它只是注销和登录路由,它处理登录,因为客户端想要设置样式。
我的config / environment.js文件如下所示:
firebase: 'https://<my-website-here>.firebaseio.com/',
torii: {
sessionServiceName: 'session'
},
应用程序/适配器/ application.js中:
import Ember from 'ember';
import FirebaseAdapter from 'emberfire/adapters/firebase';
const { inject } = Ember;
export default FirebaseAdapter.extend({
firebase: inject.service(),
});
应用程序/鸟居的适配器/ application.js中:
import Ember from 'ember';
import ToriiFirebaseAdapter from 'emberfire/torii-adapters/firebase';
export default ToriiFirebaseAdapter.extend({
firebase: Ember.inject.service()
});
应用程序/路由/ 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));
}
}
});
是的,目前,登录和注销工作正常,但我无法在会话中间刷新页面,否则它会自动退出。
提前感谢任何人。
答案 0 :(得分:3)
Torii不会为您保留您的身份验证会话。您需要在适配器的open
,fetch
和close
挂钩中自行实现。
最简单的方法是使用the localStorage API。
在fetch
挂钩中,您需要从localStorage中提取会话数据。如果那里什么都没有,要么抛出异常,要么返回reject
的承诺。
您的适配器需要resolve
包含会话数据,但也应将其存储在localStorage中以供以后的会话使用。
清除会话数据的localStorage密钥并返回resolve
的承诺。
Here's the application adapter from one of my applications,它使用带有Torii的Slack API。 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();
}
});
My storage
service is a wrapper around the browser localStorage API
答案 1 :(得分:0)
这是一种更简单的方法。
应用程序/路由/ 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