0

我正在为我的应用程序使用 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 方法根本没有被调用(它应该在刷新时调用,不是吗?)

4

3 回答 3

1

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

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

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

beforeModel: function() {
  return this.get('session').fetch().catch(function() {});
},
于 2017-02-27T09:14:40.363 回答
0

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

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

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

    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 方法中找到它

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});
    }

希望这会有所帮助

于 2017-02-27T10:22:44.697 回答
0
let token = session.token;

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

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

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

于 2017-02-27T05:22:56.367 回答