2017-11-26 8 views
0

Ich arbeite mit Angular und JWT als Authentifikator.Logout und Login in Angular 5 JWT mit möglichen Datenlecks

Einloggen, ich bekomme eine token, und damit auf die App zugreifen.

Abmelden - Ich entferne das Token von localStorage.

Problem ist, wenn ich mich erneut mit einem anderen Benutzer anmelden -> ich bekomme zuerst die zuvor initiierten Benutzerdetails und Ansichten, als ob ich mich nie ausgeloggt habe. Es ermöglicht mir, alles über den vorherigen Benutzer anzuzeigen, nur kann ich keine Aktionen ausführen, die nur er erlaubt ist, da es die Aktionswachen des Servers erfüllt.

Sobald ich aktualisieren, gibt es keinen Rest des vorherigen Benutzers und ich kann die App mit der richtigen Ansicht meines aktuellen angemeldeten Benutzers verwenden.

Ich kann dieses Problem natürlich schnell lösen, indem ich href="/" zu der Abmelde-Methode hinzufüge, abgesehen von dem Löschen des lokalen Speichers.

Aber ich fragte mich, ob da draußen eine Lösung bekannt ist, oder ob es ein bekanntes Problem überhaupt ist.

LOGIN Methode:

exports.login = function(req, res, next) { 
    User.findOne({email: req.body.email}, function(err, user) { 
    if (err) { 
     return res.status(500).json({ 
     title: 'An error occured', 
     error: err 
     }); 
    } 
    if (!user) { 
     return res.status(500).json({ 
     title: 'Login failed', 
     error: {message: 'Invalid login credentials'} 
     }); 
    } 
    if (!bcrypt.compareSync(req.body.password, user.password)) { 
     return res.status(401).json({ 
     title: 'Login failed', 
     error: {message: 'Invalid login credentials'} 
     }); 
    } 
    var token = jwt.sign({user: user._id}, app.get('shhhhh'), {expiresIn: 86400}); // Expires in 24 hours 
    res.status(200).json({ 
     message: 'Successfully logged in', 
     token: token, 
    }); 
    }); 
}; 

LOGOUT Methode:

logout() { 
    localStorage.clear(); 
    this.router.navigate(['/']); 
} 
+0

Ist bis zur nächsten Aktualisierung wieder aufgenommen wurde Dies ist ein öffentliches Projekt, das geteilt werden kann.Ich würde es lieben zu klonen und genau hinzuschauen.Ergebnis wie diese können durch zahlreiche Gründe verursacht werden.Allerdings, mein erster Zweifel wäre, wie Sie bleiben und entfernen Sie das Token auf Frontend und Backend –

+0

Hey Chau, vielen Dank für die Antwort.Ich kann es nicht ganz teilen, da es ein kommerzieller ist. Sie würden dann andeuten, die Logout-Methode hinzuzufügen, die gerade das Token aus LS entfernt, um es auch zu töten, so dass es nicht mehr akzeptiert wird -? –

+0

Ich brauche nur Ihren Login und Logout-Service zu sehen –

Antwort

0

Das jetzt gelöst.

Ich bemerkte, dass in meinem Auth Service - die „IsAuthenticated“ Methode hält mit jeder plötzlichen Bewegung im Hintergrund laufen die ich gemacht habe - wie mein ganzen Blick auf sie abgehangen:

<app-header *ngIf="isAuthenticated()"></app-header> 
<app-welcome *ngIf="!isAuthenticated()"></app-welcome> 
<app-body *ngIf="isAuthenticated()"></app-body> 

Also machte ich eine öffentliche token Variable und sobald ich ein Token hatte -

isAuthenticated() { 
    if (localStorage.getItem('token') === null) { 
    return false; 
    } else { 
    const token = localStorage.getItem('token'); 
    try { 
     const decoded = jwtDecode(token); 
     return {id: decoded.id} 
     this.token = '?token=' + token; // this is evetually what I added 
     return true; 
    } catch (err) { 
     console.log(err); 
     this.logout(); 
    } 
    } 
} 

dies half mir meine Token stellen Sie sicher, entweder hat einen Wert gebunden oder nicht, basierend auf Authentifizierung, die bei jeder Bewegung überprüft wird.

Dann injizierte ich diesen Auth-Service in allen meinen anderen Diensten, die das Token als param verwenden und Zugriff auf sie gerade mit jeder Anfrage

EX:

getProfile() { 
    return this.http.get('http://localhost:3000/api/user' + this.auth.token) 
     .map((response: Response) => response.json()) 
     .catch((error: Response) => Observable.throw(error.json())); 
    } 

Nun, zum Glück habe ich die Daten bekommen des Benutzers, an dem ich mich anmelden wollte, von Anfang an ohne Datenlecks.

(Tracing die Wurzel des Problems - ich token private Variable für alle HTTP-Dienste verwendet, die es erforderlich ist, und den Login in den Konstruktor setzen, die nicht