为什么在使用torii时在ember中刷新后没有定义会话服务

时间:2017-02-27 03:36:49

标签: facebook session ember.js torii

我正在使用facebook登录我的应用程序。我能够成功完成登录,但是当我刷新页面session.isAuthenticate变得未定义时。

我认为持久化会话的逻辑保留在torii-adapter的fetch方法中。下面是我的torii适配器,请告诉我缺少什么。

import Ember from 'ember';
import {createToken} from 'myapp-new/utils/myapp-utils';
//import User from 'myapp-new/user/model';

export default Ember.Object.extend({
  store: Ember.inject.service(),
  session: Ember.inject.service('session'),
  fetch(){
    let token = session.token;
    if(Ember.isEmpty(token)){
      throw new Error("No session found");
    }
    else{
      return Ember.RSVP.resolve({token});
    }
  },

  open: function(authentication){
    let authorizationCode = authentication.authorizationCode;
    let token = createToken();
    let adapter = this;
    return new Ember.RSVP.Promise(function(resolve, reject){
      console.log(authentication);
      Ember.$.ajax({
        url: 'http://myapp.com/getUserInfoWuthAuthCode.php',
       //url:'http://localhost:4200',
        data: { 'code': authorizationCode,token:token},
        success: Ember.run.bind(null, resolve),
        error: Ember.run.bind(null, reject)
      });
    }).then(function(data){
      let user = data.user[0];

      return {
        token:token,
        user: user
      };
    });
  }
});

更新 以下是我的路线代码

import Ember from 'ember';

export default Ember.Route.extend({
    session: Ember.inject.service('session'),
    actions:{
        signIn(){
            console.log("Working");
            this.get('session').open('google-oauth2').then(function(){
                console.log("Login Worked");
            }, function(error){
                console.log('error', 'Could not sign you in: '+error.message);
            });
        }
    },
    setupController(controller, model){
        controller.set('session', this.session);
    }
});

我没有使用任何组件,因此只在路由中挂接会话。 有一点需要注意的是我的torii-adapter的fetch方法根本没有调用(它应该在刷新时调用,不是吗?)

3 个答案:

答案 0 :(得分:1)

应该在配置文件中设置Torii会话变量,如下所示:

// config/environment.js
var ENV = {
  torii: {
  sessionServiceName: 'session'
}

这会将服务变量注入到您的路由中。此外,每次刷新应用程序时,会话都会关闭,以避免使用路由的beforeModel挂钩,如下所示:

beforeModel: function() {
  return this.get('session').fetch().catch(function() {});
},

答案 1 :(得分:0)

let token = session.token;

这将始终未定义(session对象未定义)。正确的方法是,

let token = this.get('session.token')
// OR
this.get('session')['token']

我更喜欢看起来更优雅的第一个选项,至少对我而言。

答案 2 :(得分:0)

@ Falke的答案很有帮助,但没有解决我的问题。

经过一段时间后,我发现session.isAuthenticated未定义,因为我的fetch方法没有被调用。感谢@falke我能够让它运行。

我在我的适配器的open方法中使用下面的代码将我的令牌存储在localstorage而不是session中

    open: function(authentication){
    let authorizationCode = authentication.authorizationCode;
    //let token = createToken();
   // let adapter = this;
    return new Ember.RSVP.Promise(function(resolve, reject){
      console.log(authentication);   
      resolve({authorizationCode});
    }).then(function(data){      
      localStorage.setItem('token',authorizationCode);
      return {
        token:authorizationCode        
      };
    });
  }

我可以使用下面的代码在我的获取方法中找到它

fetch(){
    let token = localStorage.getItem('token');
    console.log(token);
    if(Ember.isEmpty(token)){
      throw new Error("No session found");
    }
    else{
      return Ember.RSVP.resolve({token});
    }

希望这会有所帮助