Session 刷新后,Tori会话不会持续

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

当前,我的Ember cli应用程序在刷新后注销。为了让代码正常工作,我对代码做了很多修改,但没有任何帮助。如有必要,我将尝试与其他提供商实现身份验证

我有一个用于应用程序的路由,它只是注销,还有一个用于登录的路由,它处理登录,因为客户端希望对其进行样式化

我的config/environment.js文件如下所示:

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


我在这里找到了这个小金块:

谢谢,这肯定让我走上了正确的道路!