刷新后 Torii 会话不会持续存在

Torii session does not persist after refresh

目前,我的 Ember-cli 应用程序在刷新后注销。我已经对我的代码进行了很多更改以尝试使其正常工作,但 none 有所帮助。如有必要,我将尝试与其他提供商实施身份验证。

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

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

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

app/adapters/application.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));
    }
  }
});

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

在此先感谢大家。

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

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

获取

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

的承诺

打开

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

关闭

清除您的会话数据的 localStorage 键和return 一个将 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.

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

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