2017-01-26 2 views
0

Ich verwende ember-simple-auth und einen benutzerdefinierten Authentifizierer für eine HTTP-Basisanmeldung mit CSRF-Schutz. Alles funktioniert gut, außer dass meine Wiederherstellungsmethode manchmal fehlschlägt, wenn die Sitzung abläuft.Wiederherstellen der benutzerdefinierten Authentifizierungsmethode

Wenn die Authentifizierung erfolgreich ist, werde ich mit dem csrf-Token aufgelöst, aber wenn das Token oder die Sitzung abläuft und ich die Seite aktualisiere, ist die resolve-Methode immer noch erfolgreich, weil ich nur überprüfe, ob das Token noch vorhanden ist es ist gültig). Ich weiß, dass das falsch ist, also denke ich, dass meine Frage der richtige Weg ist, damit umzugehen? Soll ich mich auch mit der Session ID lösen? Soll ich eine AJAX-Anforderung in der Wiederherstellungsmethode mit dem gespeicherten Token senden, um zu sehen, ob sie noch gültig ist und den Erfolg zurückgibt? Ich bin an weiteren Verbesserungen interessiert, die ich auch machen könnte.

Hier ist mein Authenticator-Code:

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(); 
     } 
    } 
}); 

Antwort

0

Soll ich auch mit der Session-ID Lösung sein? Sollte ich eine AJAX-Anfrage in der Wiederherstellungsmethode mit dem gespeicherten Token senden, um zu sehen, ob es noch gültig ist und Erfolg zurückgibt? ?

Es hängt alles von den Anforderungen Ihres Projekts ab. Meiner Meinung nach ist es gut zu prüfen, ob das Token noch gültig ist. Beispiel: oauth2-password-grant speichert das abgelaufene Datum in der Sitzung und vergleicht es bei der Wiederherstellung einfach mit der aktuellen Uhrzeit. Sie können dies auch tun. Wenn Ihr Back-End über einen Tokenvalidierungsendpunkt verfügt, können Sie eine Anforderung senden, um sicherzustellen, dass das Token gültig ist.

Verwandte Themen