我正在使用带有基于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')
答案 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并检查它是否存在来完成。如果它存在,那么我们解决其他我们拒绝。请注意,这些解决和拒绝是承诺方法等。