刷新后,Torii会话不会保留

时间:2016-02-19 23:30:01

标签: session ember.js ember-cli emberfire torii

目前,我的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 个答案:

答案 0 :(得分:3)

Torii不会为您保留您的身份验证会话。您需要在适配器的openfetchclose挂钩中自行实现。

最简单的方法是使用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