2017-05-26 4 views
-2

Update Ich verwende Ember-Simple-Auth & Ember-Simple-Auth-Token Sitzung auf Ember zu pflegen. Ich möchte nicht den Refresh-Token-Ansatz verwenden, sondern möchte im Antwortheader von jeder Dienstanforderung ein neues jwt-Token erhalten.Wie JWT-Token von Antwort-Header in Ember-Simple-Auth-Sitzung

Wie kann ich meine Sitzung am Leben erhalten, indem ich das JWT-Token in der Sitzung jedes Mal aktualisiere, wenn ich eine Antwort vom Server erhalte?

+0

Ich erhalte das JWT-Token als Teil jedes Antwortheaders von meinem Back-End-Dienst. Die Idee ist eine Ablaufzeit von 30 Minuten zu Beginn während der Authentifizierung und dann versuche ich mit jeder Interaktion mit dem Backup das neue Token zu erfassen und in der Sitzung mit der Methode adapter-> handelResponse zu aktualisieren. Alles was ich versuche ist eine Sliding Session. –

+0

Das Problem, mit dem ich konfrontiert bin, ist, dass Ember-simple-auth die Token & Ablaufzeit in session.data.authenticated speichert und dies wird in der Dokumentation als readonly bezeichnet. Wie kann ich die Sitzung am Leben erhalten, wenn ich das Token nicht aktualisieren darf? –

Antwort

1

Dies kann durchgeführt werden, erfordert aber eine Erweiterung von ember-simple-auth und ember-simple-auth-token. Es ist nicht genau empfohlen, Ihren Ansatz zu verwenden, das Access-Token plus Refresh-Token ist definitiv die bevorzugte Methode. Es skaliert auch besser, da Ihre Ressourcenserver nicht die Fähigkeit haben, sich zu authentifizieren, nur um Tokens zu autorisieren und zu validieren. Es fügt auch ein wenig Overhead hinzu, um ein neues Token für jede einzelne Anfrage zu erzeugen. Während ich diesen Kurs nicht empfehle, hier ist, wie es gemacht werden kann:

Wie Sie entdeckt haben, können Sie die Sitzung nicht direkt aktualisieren, aber wenn Sie in den Quellcode tauchen werden Sie feststellen, dass ember-simple-auth eine event verwendet Aktualisiere es. Dieses Ereignis wird jedoch nur funktionieren, wenn Sie eine authenticator überschreiben/anpassen. Wahrscheinlich ember-simple-auth-token 's authenticators/jwt.js. Wenn Sie auf ihren Authentifikator schauen, können Sie ein Beispiel sehen, wie man update the session.

Also, ich würde empfehlen, erstellen Sie Ihre eigenen benutzerdefinierten JWT-Token-Authentifikator, der ember-simple-auth-token erweitert. Es wird wahrscheinlich eine Methode hinzufügen, um die session zu aktualisieren, oder vielleicht besser, um die rohen Anforderungsheader zu verarbeiten, die ein neues Zugriffstoken enthalten.

Nachdem das abgeschlossen ist, haben Sie die Wahl. Sie können entweder Ihre eigene adapter überschreiben und diese Funktion von dort selbst aufrufen, oder die bessere Wahl wäre,'s data-adapter-mixin mixin zu überschreiben. Wenn Sie ember-simple-authdata-adapter-mixin überschreiben, scheint dies der beste Ausgangspunkt zu sein: handleResponse. Wenn Sie diese Funktion überschreiben, sollten Sie Zugriff auf Ihre RAW-API-Antwort haben, über die Sie die Funktion für die Aktualisierungssitzung aufrufen können.

Wie Sie sehen können, ist dies keine triviale Änderung. Es steht definitiv im Widerspruch zu dem, wozu diese Bibliotheken ursprünglich gedacht waren, aber wenn man viel Arbeit einbringt, sollte es möglich sein.

Updates für Kommentar des OP
ich beide dieser Anforderungen tatsächlich umgesetzt vor: „1) Session-Timeout zu haben, nachdem ein Pre-Leerlaufzeit konfiguriert 2) erlauben, bestimmte Gruppe von Benutzern Proxy und schalten Sie den Rahmen. Benutzer sofort anmelden ". Es stellt sich heraus, dass es mit einem Refresh-Token-Modell eigentlich ziemlich einfach ist.

Um # 1 zu unterstützen, sollte der Refresh-Token-Ablauf auf die Länge der Leerlaufzeit vor dem Abmelden gesetzt werden. z.B. Wenn das Aktualisierungstoken in 30 Minuten abläuft und das Zugriffstoken in 5 Minuten abläuft. Der Client ruft automatisch alle 5 Minuten neue Zugriffstoken (und optional ein Aktualisierungstoken) ab, basierend auf dem Spielraum. Wenn der Benutzer die Seite jedoch länger als 30 Minuten verlässt, ist das Aktualisierungstoken abgelaufen und muss erneut authentifiziert werden.

Für # 2, leider, es dauert ein bisschen von ember-simple-auth-token zu arbeiten, aber es ist relativ einfach und etwas, das ich bereits implementiert habe. Im Grunde erstellen Sie einen benutzerdefinierten Authentifizierer, der über eine zusätzliche Funktion verfügt, um Token für einen neuen mit aktualisiertem Kontext/Status auszutauschen und darauf zuzugreifen.Siehe meine Implementierung unter:

ember-simple-auth-token außer Kraft gesetzt Authentifikator:

/** 
    Provides a public method to call to exchange an access token for an 
    updated access token with updated data encoded in it. This method 
    essentially asks the backend to update an access token with different 
    values. This is, at the moment, is only used to switch the company root 
    attribute in the token (AKA switch companies for admins). 

    @param {string} token - The valid access token 
    @param {object} [headers] - An optional object which can add additional 
    headers to the request 

    @param {object} additionalData - An object which contains the data which should be updated on the token. It should look something like this: 
    ``` 
    { 
     company_root_id: '<UUID of a valid company root>' 
    } 
    ``` 
    @return {Promise} A promise which is the request. It will either resolve 
    with the updated session data or reject with the error. 
    */ 
exchangeAccessToken(token, headers, additionalData) { 
    const data = this.makeRefreshData(token); 
    Ember.merge(data, additionalData); 

    return new Ember.RSVP.Promise((resolve, reject) => { 
     this.makeRequest(this.serverTokenRefreshEndpoint, data, headers).then(response => { 
      Ember.run(() => { 
       try { 
        const sessionData = this.handleAuthResponse(response); 

        this.trigger('sessionDataUpdated', sessionData); 
        resolve(sessionData); 
       } catch(error) { 
        reject(error); 
       } 
      }); 
     }, (xhr, status, error) => { 
      Ember.Logger.warn(`Access token could not be refreshed - server responded with ${error}.`); 
      reject(); 
     }); 
    }); 
} 

Aktion den Token Austausch auslösen:

switchCompany(companyId) { 
    let session = this.get('_session.session'); 

    if(!this.get('isAdministrator')) { 
     throw new Error('Logged in user is not an administrator, they cannot switch companies.'); 
    } 

    let token = session.get('authenticated.access_token'); 
    let appInstance = Ember.getOwner(this); 
    let authorizerName = session.get('authenticator'); 
    let authorizer = appInstance.lookup(authorizerName); 
    if(!authorizer) { 
     throw new Error(`Authorizer (${authorizerName}) does not exist`); 
    } 
    if(typeof authorizer.exchangeAccessToken !== 'function') { 
     throw new Error(`Authorizer (${authorizerName}) does not have an \`exchangeAccessToken\` method.`); 
    } 
    return authorizer.exchangeAccessToken(token, null, { 
     company_root_id: companyId 
    }); 
} 

Das Backend wäre natürlich muß erweitert werden, um zusätzliche Parameter auf den Aktualisierungs-Token zu akzeptieren Endpunkt, der es dem Benutzer ermöglicht, die Rollen zu wechseln, wenn er autorisiert ist.

+0

Hallo Michael, Vielen Dank für Ihren wertvollen Vorschlag. Meine Überlegungen zum Auffrischen des Tokens basierten auf zwei Voraussetzungen: 1) nach einer vorkonfigurierten Leerlaufzeit eine Sitzungszeitüberschreitung zu haben. 2) Erlauben Sie bestimmten Benutzergruppen, sich im laufenden Betrieb zu wechseln und den Kontext des angemeldeten Benutzers zu wechseln. Wie Sie vorgeschlagen haben, evaluiere ich andere Mittel, um diese Aufgaben zu erfüllen und die Basisimplementierung von ember-simple-auth nicht zu überschreiben. Wenn diese Ansätze fehlschlagen, dann versuchen Sie, den Authentifikator zu erweitern und als letzten Ausweg zu mischen. –

+0

@ PrajwalBoloor, habe ich meine Antwort aktualisiert, um zu zeigen, wie Sie Ihre Anforderungen mit einem Refresh-Token-Modell erfüllen können. –

Verwandte Themen