使用JQuery使用JWT,不断收到错误

时间:2016-08-21 15:30:37

标签: jquery node.js jwt

我目前正在使用JSONWebtoken与NodeJS构建API。当我尝试使用标头中的令牌时,我收到错误403,它直接转到下面代码中的else语句,这意味着令牌根本不存在。

以下是我在服务器端获取令牌的方法:

router.use(function(req, res, next){

var token = req.body.token || req.query.token || req.headers['x-access-token'];

  //decode token
  if(token)   {
    jwt.verify(token, app.get('secretKey'), function(err, decoded){
      if(err)
        return res.json({ success:false, message: 'failed, token problem'});
      else {
        req.decoded = decoded;
        next();
      }
    });
  }else {
    return res.status(403).send({
      success:false,
      message: 'token not provided'
    })
  }
});

在客户端,我使用JQuery并将其保存在cookie中:

  1. 令牌作为数据起作用:

    $.ajax({
      type:'GET',
      dataType: 'jsonp',
      url :"http://localhost:3000/api/users",
      data : {
        token : $.cookie('token')
      },
      success: function(data, status) {
        console.log("Status " + status);
        console.log(data);
      }
    });
    
  2. 令牌作为参数也适用

    $.get("http://localhost:3000/api/users?token=" + $.cookie('token'))
     .done(function(data){
       console.log(data);
     });
    
  3. 这是问题,使用标题

    $.ajax({
      type:'GET',
      url :"http://localhost:3000/api/users",
      beforeSend: function(xhr) {
        xhr.setRequestHeader("Authorization", "Bearer " + $.cookie('token'));
      },
      success: function(data, status) {
        console.log("Status " + status);
        console.log(data);
      }
    });
    
  4. 我还尝试在ajaxSetup上添加x-access-token作为头文件

    $.ajaxSetup({
              headers: {
                'x-access-token': $.cookie('token')
              }
            });
    

    我一直收到403,这是令牌未提供,我认为这是一个CORS问题所以我试图使用CORS npm包https://github.com/expressjs/cors不起作用,我试图实现这个。

    app.use(function(req, res, next){
      res.header('Access-Control-Allow-Origin', '*');
      res.header('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE');
      res.header('Access-Control-Allow-Headers', 'Content-Type');
      next();
    });
    

    // 2016年8月22日更新信息

    如果我在Safari中使用以下内容,则可以:

      $.ajax({
          type:'GET',
          url :"http://localhost:3000/api/users",
          headers : { "Authorization" : $.cookie('token') },
          success: function(data, status) {
            console.log("Status " + status);
            console.log(data);
          }
        });
    

    但有些内容如何和if语句一起使用,所以它会响应下一个路由,但也会显示403消息。

1 个答案:

答案 0 :(得分:0)

我使用节点包

更改我的cors设置
https://github.com/expressjs/cors

到目前为止它的使用方法

$.ajax({
          type:'GET',
          url :"http://localhost:3000/api/users",
          headers: {'x-access-token': $.cookie('token')},
          success: function(data, status) {
            console.log("Status " + status);
            console.log(data);
          }
        });