2016-04-30 17 views
0

Ich versuche, einige serverseitige Authentifizierung zu tun.JWT Serverseite Authentifizierung JsonWebTokenError

In Server-Seite Login()

var jwt = require('jsonwebtoken'); 
.... 
if (user.hash != hash(pass, user.salt)) { 
    return invalid("Wrong password"); 
} 

var token = jwt.sign(user, 'superSecret'); 

res.json({ 
     success: true, 
     message: '', 
     auth_token: token 
}); 

In Client-Seite http

createHero(hero: Hero) { 
     let body = JSON.stringify({ hero }); 
     let headers = new Headers({ 'Content-Type': 'application/json' }); 
     let authToken = localStorage.getItem('auth_token'); 
     headers.append('Authorization', `Bearer ${authToken}`); 
     let options = new RequestOptions({ headers: headers });  

     this.http.post(`${this._baseUrl}create/`, body, options) 
       .map(response => response.json()) 
       .subscribe(data => { 
            this._dataStore.heroes.push(data); 
            this._dataStore.hero = data; 
            this._heroObserver.next(this._dataStore.hero); 
            }, 
          error => this.handleError('Could not create hero.') 
         ); 
    } 

In serverseitige Validierung

var token = req.headers.authorization; 
    var h = req.headers; 

    // decode token 
    if (token) { 

    // verifies secret and checks exp 
    aaa = jwt.verify(token, 'superSecret', function(err, decoded) { 
     console.log(decoded);  
     if (err) { 
     return res.json({ success: false, message: 'Failed to authenticate token on API server.' });  
     } else { 
     // if everything is good, save to request for use in other routes 
     req.decoded = decoded;  
     next(); 
     } 
    }); 
    console.log(aaa); 
    } else { 
    // if there is no token return an error 
    return res.status(403).send({ 
     success: false, 
     message: 'No token provided.' 
    });  
    } 

bekam ich das Token korrekt auf dem Server zurück. Autorisierung: "Bearer ....."

Aber es kann nicht verifizieren. Ich habe JsonWebTokenError Ungültiges Token erhalten.

Kann jemand helfen, aufzuzeigen, was ich verpasst habe?

Antwort

0

sign() und verify() beide haben sync und async version. sign() sync erzeugt eine Token-Zeichenfolge und async erzeugt ein Token-Objekt. Ich habe die Sync-Version von sign() verwendet, daher muss ich die Sync-Version verwenden, um das Token von String zurück zu dekodieren. wie dieser

if (token) { 
    try { 
     var decoded = jwt.verify(token, 'superSecrete'); 
    } catch (err) { 
     return res.json({ success: false, message: 'Failed to authenticate token on API server.' }); 
    } 
    req.decoded = decoded;  
    next(); 
    } else { 
    return res.status(403).send({ 
     success: false, 
     message: 'No token provided.' 
    });  
    }