刷新页面后,ember-simple-auth session.isAuthenticated为false

时间:2017-10-16 13:13:56

标签: ember.js ember-simple-auth

我正在使用带有基于Cookie的身份验证的ember-simple-auth。 当我登录时{{session.isAuthenticated}}为真,但是当我重新加载页面时,这是假的,但是localStore没有改变。

这是我的custom.js身份验证器:

import Base from 'ember-simple-auth/authenticators/base';
import config from '../config/environment';

export default Base.extend({
    tokenEndpoint: config.apiUrl + '/user/signIn',
    restore(data) {      
      console.log(data);
      return RSVP.resolve(data);
    },
    authenticate(username, password) {
      return Ember.$.ajax({
          url: this.tokenEndpoint,
          type: 'POST',
          data: JSON.stringify({
            username: username,
            password: password,
          }),
          contentType: 'application/json;charset=utf-8',
          dataType: 'json',
      });

    },
    invalidate: function () {
      return Ember.RSVP.resolve();
    },
  });

我正在使用application.hbs中的{{session.isAuthenticated}}。所以我在应用程序控制器中注入会话:

session: Ember.inject.service('session')

1 个答案:

答案 0 :(得分:5)

你犯了一个错误。每次刷新页面或打开另一个选项卡时都会调用“restore”方法。请注意,RSVP.resolve会删除您的本地存储,因此所有存储都是未经身份验证的。当我们想要将用户注销时,我们使用它,这意味着Ember Simple Auth将删除其本地存储cookie,当找不到此cookie时,它总是为isAuthenticated方法发送false。

RSVP.resolve(data);

从此

更改恢复功能
restore(data) {      
  console.log(data);
  return RSVP.resolve(data);
},

到这个

restore(data) { 
    return new Promise((resolve, reject) => {
      resolve(data);
    });
},

请注意,此“恢复”方法就像我们必须根据网站规则覆盖的方法,例如,如果您有令牌身份验证,我们会将此方法编写为

restore(data) {
  return new Promise((resolve, reject) => {
    if (!Ember.isEmpty(data.token)) {
      console.log(data);
      resolve(data);
    } else {
      reject();
    }
});
},

请注意我们如何使用自己的逻辑处理事物,以查看localstorage中是否存在令牌属性。

类似地,我们可以通过在此方法中获取会话cookie并检查它是否存在来完成。如果它存在,那么我们解决其他我们拒绝。请注意,这些解决和拒绝是承诺方法等。