Сессия тории не сохраняется после обновления

В настоящее время мое приложение 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

Другие вопросы по тегам