jwt 服务器端认证 JsonWebTokenError

Posted

技术标签:

【中文标题】jwt 服务器端认证 JsonWebTokenError【英文标题】:jwt server side authentication 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._baseUrlcreate/`, 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】:

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

【讨论】:

以上是关于jwt 服务器端认证 JsonWebTokenError的主要内容,如果未能解决你的问题,请参考以下文章

php 后端实现JWT认证方法

JWT认证机制

jwt使用token传递前后端认证 实战项目演练

后端架构token授权认证机制:spring security JSON Web Token(JWT)简例

spring boot整合jwt 实现前后端分离登录认证及授权

后端架构token授权认证机制:spring security JSON Web Token(JWT)简例