【问题标题】:Torii session does not persist after refreshTorii 会话在刷新后不会持续存在
【发布时间】:2016-02-19 23:30:01
【问题描述】:

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

我有一个应用程序的路由,它只是注销和登录的路由,它处理登录,因为客户端想要设置它的样式。

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

firebase: 'https://<my-website-here>.firebaseio.com/',
    torii: {
      sessionServiceName: 'session'
    },

应用程序/适配器/应用程序.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));
    }
  }
});

是的,目前,登录和注销工作正常,但我无法在会话中间刷新页面,否则它会自动注销我。

提前感谢任何人。

【问题讨论】:

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


    【解决方案1】:

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

    最简单的方法是使用the localStorage API

    获取

    fetch 挂钩中,您需要从localStorage 中提取会话数据。如果那里什么都没有,要么抛出一个异常,要么返回一个将 reject 的承诺。

    打开

    您的适配器需要resolve 处理会话数据,但还应将其存储在 localStorage 中以供以后的会话使用。

    关闭

    清除会话数据的 localStorage 键并返回一个承诺,它将resolve

    示例

    Here's the application adapter from one of my applications,它将 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();
      }
    });
    

    My storage service is a wrapper around the browser localStorage API.

    【讨论】:

    • 谢谢,这绝对让我走上了正轨!
    【解决方案2】:

    这里有一个更简单的方法。

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-15
      • 2017-02-16
      • 2015-06-15
      • 2019-01-05
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多