修复自定义身份验证器的恢复方法

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 在会话中存储到期日期,恢复时只需将其与当前时间进行比较。你也可以这样做。或者,如果您的后端有一些令牌验证端点,您可以发送请求以确保令牌是否有效。