【问题标题】:jwt server side authentication JsonWebTokenErrorjwt 服务器端认证 JsonWebTokenError
【发布时间】:2016-08-25 07:00:18
【问题描述】:

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

在服务器端登录()

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

谁能帮忙指出我错过了什么?

【问题讨论】:

    标签: express angular jwt express-jwt


    【解决方案1】:

    sign() 和 verify() 都有同步和异步版本。 sign() 同步产生一个令牌字符串,异步产生一个令牌对象。我使用了 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.' 
        });    
      }
    

    【讨论】:

      猜你喜欢
      • 2017-03-08
      • 1970-01-01
      • 2018-05-05
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 2019-05-29
      • 1970-01-01
      相关资源
      最近更新 更多