2

目前,我的 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));
    }
  }
});

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

提前感谢任何人。

4

2 回答 2

3

Torii 不会为您保留身份验证会话。您需要自己在适配器的 、 和 钩子中open实现fetch这一点。close

最简单的方法是使用localStorage API

拿来

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

打开

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

清除会话数据的 localStorage 键并返回一个将resolve.

例子

这是我的一个应用程序中的应用程序适配器,它使用了 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();
  }
});

我的storage服务是浏览器 localStorage API 的包装器

于 2016-02-20T11:41:16.603 回答
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

于 2017-05-18T19:56:52.120 回答