Session 刷新后,Tori会话不会持续
当前,我的Ember cli应用程序在刷新后注销。为了让代码正常工作,我对代码做了很多修改,但没有任何帮助。如有必要,我将尝试与其他提供商实现身份验证 我有一个用于应用程序的路由,它只是注销,还有一个用于登录的路由,它处理登录,因为客户端希望对其进行样式化 我的config/environment.js文件如下所示:Session 刷新后,Tori会话不会持续,session,ember.js,ember-cli,emberfire,torii,Session,Ember.js,Ember Cli,Emberfire,Torii,当前,我的Ember cli应用程序在刷新后注销。为了让代码正常工作,我对代码做了很多修改,但没有任何帮助。如有必要,我将尝试与其他提供商实现身份验证 我有一个用于应用程序的路由,它只是注销,还有一个用于登录的路由,它处理登录,因为客户端希望对其进行样式化 我的config/environment.js文件如下所示: firebase: 'https://<my-website-here>.firebaseio.com/', torii: { sessionSer
firebase: 'https://<my-website-here>.firebaseio.com/',
torii: {
sessionServiceName: 'session'
},
app/torii adapters/application.js:
import Ember from 'ember';
import FirebaseAdapter from 'emberfire/adapters/firebase';
const { inject } = Ember;
export default FirebaseAdapter.extend({
firebase: inject.service(),
});
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({
actions: {
logout: function() {
this.get('session').close().then(function() {
this.transitionTo('application');
}.bind(this));
}
}
});
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');
}
});
app/routes/application.js:
import Ember from 'ember';
import FirebaseAdapter from 'emberfire/adapters/firebase';
const { inject } = Ember;
export default FirebaseAdapter.extend({
firebase: inject.service(),
});
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({
actions: {
logout: function() {
this.get('session').close().then(function() {
this.transitionTo('application');
}.bind(this));
}
}
});
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');
}
});
app/routes/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));
}
}
});
<>是的,当前登录和注销工作很好,但是我不能在会话中间刷新页面,否则它会自动注销我。< /P>
提前感谢所有人 Tori不会为您保留身份验证会话。您需要在适配器的
open
、fetch
和close
挂钩中自己实现这一点
最简单的方法是使用
取来
在fetch
hook中,您需要将会话数据从本地存储中拉出。如果没有任何内容,则抛出异常或返回承诺,该承诺将拒绝
打开
您的适配器需要使用会话数据解析,但也应该将其存储在本地存储中,以供以后的会话使用
接近
清除会话数据的localStorage密钥并返回一个承诺,该承诺将解析
例子
,它将Slack API与Tori一起使用。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();
}
});
.这里有一个更简单的方法
app/routes/application.js:
import Ember from 'ember';
import FirebaseAdapter from 'emberfire/adapters/firebase';
const { inject } = Ember;
export default FirebaseAdapter.extend({
firebase: inject.service(),
});
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({
actions: {
logout: function() {
this.get('session').close().then(function() {
this.transitionTo('application');
}.bind(this));
}
}
});
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
我在这里找到了这个小金块:谢谢,这肯定让我走上了正确的道路!