首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >刷新后Torii会话不持久化。

刷新后Torii会话不持久化。
EN

Stack Overflow用户
提问于 2016-02-19 23:30:01
回答 2查看 827关注 0票数 2

当前,我的Ember-cli应用程序在刷新后注销。为了让代码正常工作,我对代码做了很多修改,但没有人帮上忙。如果有必要,我将尝试与另一个提供程序实现身份验证。

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

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

代码语言:javascript
复制
firebase: 'https://<my-website-here>.firebaseio.com/',
    torii: {
      sessionServiceName: 'session'
    },

app/适配器/application.js:

代码语言:javascript
复制
import Ember from 'ember';
import FirebaseAdapter from 'emberfire/adapters/firebase';

const { inject } = Ember;

export default FirebaseAdapter.extend({
  firebase: inject.service(),
});

app/torii-适配器/application.js:

代码语言:javascript
复制
import Ember from 'ember';
import ToriiFirebaseAdapter from 'emberfire/torii-adapters/firebase';

export default ToriiFirebaseAdapter.extend({
  firebase: Ember.inject.service()
});

app/routes/application.js:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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));
    }
  }
});

是的,目前,登录和注销都很好,但是我不能在会话中间刷新页面,否则它会自动注销我。

感谢任何人事先。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-20 11:41:16

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

最简单的方法是使用localStorage API

获取

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

打开

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

清除会话数据的localStorage键,并返回resolve承诺。

示例

下面是我的一个应用程序的应用程序适配器,它与Torii一起使用Slack。open钩子可能与您需要的Firebase不同,但希望这能给您提供一些可以使用的东西。

代码语言:javascript
复制
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();
  }
});

服务是浏览器localStorage API的包装器。

票数 3
EN

Stack Overflow用户

发布于 2017-05-18 19:56:52

这里有个简单得多的方法。

app/routes/application.js:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35516992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档