2016-04-30 15 views
0

私はいくつかのサーバーサイド認証をしようとしています。サーバー側のログインでjwtサーバーサイド認証JsonWebTokenError

()

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

クライアント側の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.') 
         ); 
    } 

サーバー側の検証で

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.' 
    });  
    } 

私は戻って正しく、サーバー上のトークンを得ました。承認: "ベアラ....."

しかし、それは確認できません。私はJsonWebTokenErrorトークンが無効です。

誰かが私が逃したことを指摘できますか?

答えて

0

sign()とverify()の両方にsyncとasyncバージョンがあります。 sign()syncはトークン文字列を生成し、asyncはトークンオブジェクトを生成します。私はsign()の同期バージョンを使用したので、syncバージョンを使用して文字列のトークンをデコードする必要があります。このように

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.' 
    });  
    }