Сессия тории не сохраняется после обновления
В настоящее время мое приложение 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));
}
}
});
Да, в настоящее время вход в систему и выход из системы работают просто отлично, но я не могу обновить страницу в середине сеанса, иначе он автоматически выходит из системы.
Спасибо всем заранее.
2 ответа
Torii не сохраняет ваш сеанс аутентификации для вас. Вы должны реализовать это самостоятельно в open
, fetch
, а также close
крючки вашего адаптера.
Самый простой способ сделать это с помощью API localStorage.
получать
в fetch
хук, вам нужно вытащить данные вашего сеанса из localStorage. Если там ничего нет, либо сгенерируйте исключение, либо верните обещание, которое reject
,
открыто
Ваш адаптер должен resolve
с данными сеанса, но также следует сохранить их в localStorage для последующих сеансов.
близко
Очистите ключ localStorage для данных сеанса и верните обещание, которое будет resolve
,
пример
Вот адаптер приложения от одного из моих приложений, который использует Slack API с Torii. 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();
}
});
мой storage
Сервис является оберткой вокруг браузера localStorage API.
Вот гораздо более простой способ.
приложение / маршруты /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