ember-simple-auth session.isAuthentication在刷新页面后为假



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

这是我的自定义.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')

你犯了一个错误。'恢复'方法每次我们刷新页面或打开另一个选项卡时都会调用。请注意,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();
    }
});
},

请注意,我们如何用自己的逻辑来处理事情,以查看本地存储中是否存在令牌属性。

同样,我们可以通过在此方法中获取会话cookie并检查它是否存在来做到这一点。如果它存在,那么我们解决否则我们拒绝。请注意,这些解决和拒绝是承诺方法等。

最新更新