我正在使用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并检查它是否存在来做到这一点。如果它存在,那么我们解决否则我们拒绝。请注意,这些解决和拒绝是承诺方法等。