修复自定义身份验证器的恢复方法
Fixing custom authenticator's restore method
我正在使用 ember-simple-auth 和一个自定义身份验证器来进行具有 CSRF 保护的 HTTP 基本登录。一切正常,除了有时我的恢复方法会在它应该失败时解决,比如会话过期时。
当身份验证成功时,我使用 csrf 令牌解析,但是当令牌或会话过期并且我刷新页面时,解析方法仍然成功,因为我所做的只是检查令牌是否仍然存在(不是如果有效)。我知道这是错误的,所以我想我的问题是处理这个问题的正确方法是什么?我是否也应该使用会话 ID 进行解析?我是否应该使用存储的令牌在恢复方法中发送 AJAX 请求以查看它是否仍然有效并且 returns 成功?我也有兴趣了解我可以做出的任何其他改进。
这是我的验证码:
import Ember from 'ember';
import ENV from 'criteria-manager/config/environment';
import Base from 'ember-simple-auth/authenticators/base';
export default Base.extend({
restore(data) {
return new Ember.RSVP.Promise((resolve, reject) => {
if (data.token) {
Ember.$.ajaxSetup({
headers: {
'X-XSRF-TOKEN': data.token
}
});
resolve(data);
}
else {
reject();
}
});
},
authenticate(credentials) {
let csrfToken = this.getCookie('XSRF-TOKEN');
return new Ember.RSVP.Promise((resolve, reject) => {
Ember.$.ajax({
beforeSend: function(xhr) {
xhr.setRequestHeader("Authorization", "Basic " + btoa(credentials.username + ":" + credentials.password));
xhr.setRequestHeader("X-XSRF-TOKEN", csrfToken);
},
url: ENV.host + "/api/users/login",
method: 'POST'
}).done(() => {
//A new CSRF token is issued after login, add it to future AJAX requests
Ember.$.ajaxSetup({
headers: {
'X-XSRF-TOKEN': this.getCookie('XSRF-TOKEN')
}
});
Ember.run(() => {
resolve({
token: this.getCookie('XSRF-TOKEN')
});
});
}).fail((xhr) => {
Ember.run(() => {
if(xhr.status === 0) {
reject("Please check your internet connection!");
}
else if (xhr.status === 401) {
reject("Invalid username and/or password.");
}
else {
reject("Error: Http Status Code " + xhr.status);
}
});
});
});
},
invalidate() {
return new Ember.RSVP.Promise((resolve, reject) => {
let csrfToken = this.getCookie('XSRF-TOKEN');
Ember.$.ajax({
beforeSend: function(xhr) {
xhr.setRequestHeader("X-XSRF-TOKEN", csrfToken);
},
url: ENV.host + '/logout',
method: 'POST'
}).done(() => {
Ember.run(() => {
resolve();
});
}).fail(() => {
Ember.run(() => {
reject();
});
});
});
},
getCookie(name) {
let alLCookies = "; " + document.cookie;
let cookieArray = alLCookies.split("; " + name + "=");
if (cookieArray.length === 2) {
return cookieArray.pop().split(";").shift();
}
}
});
Should I also be resolving with the session id? Should I be sending an
AJAX request in the restore method with the stored token to see if it
is still valid and returns success?
这完全取决于您项目的需要。在我看来,检查令牌是否仍然有效是件好事。例如,oauth2-password-grant 在会话中存储到期日期,恢复时只需将其与当前时间进行比较。你也可以这样做。或者,如果您的后端有一些令牌验证端点,您可以发送请求以确保令牌是否有效。
我正在使用 ember-simple-auth 和一个自定义身份验证器来进行具有 CSRF 保护的 HTTP 基本登录。一切正常,除了有时我的恢复方法会在它应该失败时解决,比如会话过期时。
当身份验证成功时,我使用 csrf 令牌解析,但是当令牌或会话过期并且我刷新页面时,解析方法仍然成功,因为我所做的只是检查令牌是否仍然存在(不是如果有效)。我知道这是错误的,所以我想我的问题是处理这个问题的正确方法是什么?我是否也应该使用会话 ID 进行解析?我是否应该使用存储的令牌在恢复方法中发送 AJAX 请求以查看它是否仍然有效并且 returns 成功?我也有兴趣了解我可以做出的任何其他改进。
这是我的验证码:
import Ember from 'ember';
import ENV from 'criteria-manager/config/environment';
import Base from 'ember-simple-auth/authenticators/base';
export default Base.extend({
restore(data) {
return new Ember.RSVP.Promise((resolve, reject) => {
if (data.token) {
Ember.$.ajaxSetup({
headers: {
'X-XSRF-TOKEN': data.token
}
});
resolve(data);
}
else {
reject();
}
});
},
authenticate(credentials) {
let csrfToken = this.getCookie('XSRF-TOKEN');
return new Ember.RSVP.Promise((resolve, reject) => {
Ember.$.ajax({
beforeSend: function(xhr) {
xhr.setRequestHeader("Authorization", "Basic " + btoa(credentials.username + ":" + credentials.password));
xhr.setRequestHeader("X-XSRF-TOKEN", csrfToken);
},
url: ENV.host + "/api/users/login",
method: 'POST'
}).done(() => {
//A new CSRF token is issued after login, add it to future AJAX requests
Ember.$.ajaxSetup({
headers: {
'X-XSRF-TOKEN': this.getCookie('XSRF-TOKEN')
}
});
Ember.run(() => {
resolve({
token: this.getCookie('XSRF-TOKEN')
});
});
}).fail((xhr) => {
Ember.run(() => {
if(xhr.status === 0) {
reject("Please check your internet connection!");
}
else if (xhr.status === 401) {
reject("Invalid username and/or password.");
}
else {
reject("Error: Http Status Code " + xhr.status);
}
});
});
});
},
invalidate() {
return new Ember.RSVP.Promise((resolve, reject) => {
let csrfToken = this.getCookie('XSRF-TOKEN');
Ember.$.ajax({
beforeSend: function(xhr) {
xhr.setRequestHeader("X-XSRF-TOKEN", csrfToken);
},
url: ENV.host + '/logout',
method: 'POST'
}).done(() => {
Ember.run(() => {
resolve();
});
}).fail(() => {
Ember.run(() => {
reject();
});
});
});
},
getCookie(name) {
let alLCookies = "; " + document.cookie;
let cookieArray = alLCookies.split("; " + name + "=");
if (cookieArray.length === 2) {
return cookieArray.pop().split(";").shift();
}
}
});
Should I also be resolving with the session id? Should I be sending an AJAX request in the restore method with the stored token to see if it is still valid and returns success?
这完全取决于您项目的需要。在我看来,检查令牌是否仍然有效是件好事。例如,oauth2-password-grant 在会话中存储到期日期,恢复时只需将其与当前时间进行比较。你也可以这样做。或者,如果您的后端有一些令牌验证端点,您可以发送请求以确保令牌是否有效。