刷新后 Torii 会话不会持续存在
Torii session does not persist after refresh
目前,我的 Ember-cli 应用程序在刷新后注销。我已经对我的代码进行了很多更改以尝试使其正常工作,但 none 有所帮助。如有必要,我将尝试与其他提供商实施身份验证。
我有一个应用程序路由,它只是注销和一个登录路由,它处理登录,因为客户端想要设置它的样式。
我的 config/environment.js 文件如下所示:
firebase: 'https://<my-website-here>.firebaseio.com/',
torii: {
sessionServiceName: 'session'
},
app/adapters/application.js:
import Ember from 'ember';
import FirebaseAdapter from 'emberfire/adapters/firebase';
const { inject } = Ember;
export default FirebaseAdapter.extend({
firebase: inject.service(),
});
app/torii-adapters/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));
}
}
});
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));
}
}
});
是的,目前,登录和注销工作正常,但我不能在会话中间刷新页面,否则它会自动注销我。
在此先感谢大家。
Torii 不会为您保存身份验证会话。您需要在适配器的 open
、fetch
和 close
挂钩中自行实现。
最简单的方法是使用 the localStorage API。
获取
在 fetch
挂钩中,您需要将会话数据从 localStorage 中提取出来。如果那里什么都没有,要么抛出一个异常,要么 return 一个将 reject
.
的承诺
打开
您的适配器需要 resolve
会话数据,但也应将其存储在 localStorage 中以供以后会话使用。
关闭
清除您的会话数据的 localStorage 键和return 一个将 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.
这里有一个更简单的方法。
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
目前,我的 Ember-cli 应用程序在刷新后注销。我已经对我的代码进行了很多更改以尝试使其正常工作,但 none 有所帮助。如有必要,我将尝试与其他提供商实施身份验证。
我有一个应用程序路由,它只是注销和一个登录路由,它处理登录,因为客户端想要设置它的样式。
我的 config/environment.js 文件如下所示:
firebase: 'https://<my-website-here>.firebaseio.com/',
torii: {
sessionServiceName: 'session'
},
app/adapters/application.js:
import Ember from 'ember';
import FirebaseAdapter from 'emberfire/adapters/firebase';
const { inject } = Ember;
export default FirebaseAdapter.extend({
firebase: inject.service(),
});
app/torii-adapters/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));
}
}
});
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));
}
}
});
是的,目前,登录和注销工作正常,但我不能在会话中间刷新页面,否则它会自动注销我。
在此先感谢大家。
Torii 不会为您保存身份验证会话。您需要在适配器的 open
、fetch
和 close
挂钩中自行实现。
最简单的方法是使用 the localStorage API。
获取
在 fetch
挂钩中,您需要将会话数据从 localStorage 中提取出来。如果那里什么都没有,要么抛出一个异常,要么 return 一个将 reject
.
打开
您的适配器需要 resolve
会话数据,但也应将其存储在 localStorage 中以供以后会话使用。
关闭
清除您的会话数据的 localStorage 键和return 一个将 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.
这里有一个更简单的方法。
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