jwt服务器端认证JsonWebTokenError

时间:2016-04-30 01:41:12

标签: express angular jwt express-jwt

我正在尝试进行一些服务器端身份验证。

在服务器端登录()

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无效令牌。

任何人都可以帮助指出我错过的内容吗?

1 个答案:

答案 0 :(得分:0)

sign()和verify()都有同步和异步版本。 sign()sync生成一个标记字符串,async生成一个标记对象。我使用了sign()的同步版本,所以我需要使用同步版本来解码字符串返回的令牌。像这样

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