2016-08-21 11 views
6

Aktualnie buduję API z NodeJS przy użyciu JSONWebtoken. Kiedy próbuję zużywać token w nagłówku, otrzymuję błąd 403 i przechodzi bezpośrednio do instrukcji else w poniższym kodzie, co oznacza, że ​​tokena w ogóle nie istnieje.Spożywanie JWT z JQuery, ciągle otrzymuję błąd

Oto jak uzyskać żeton na stronie serwera:

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

na stronie klienta, używam jQuery i zapisać go w pliku cookie:

  1. żeton jak działa dane:

    $.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. żeton jako parametr działa zbyt

    $.get("http://localhost:3000/api/users?token=" + $.cookie('token')) 
    .done(function(data){ 
        console.log(data); 
    }); 
    
  3. Tutaj jest problem, używając nagłówku

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

Próbowałem również Dodaj x-access-żeton jako cel na ajaxSetup

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

Wciąż dostaję 403, który jest nie podano tokena, myślę, że jest to kwestia CORS, więc próbowałem użyć pakietu CORS npm https://github.com/expressjs/cors nie działa, próbowałem to zaimplementować.

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

// aktualizacji informacji w dniu 22 sierpnia 2016

jeśli mogę użyć następujących w Safari, to działa:

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

ale niektóre jak to zarówno wtedy, else, więc odpowiada na następną trasę, ale pokazuje także komunikat 403.

+0

masz kodu po stronie serwera? Jeśli przeprowadziłeś weryfikację innymi metodami i zakończyły się one sukcesem, ale Twój plik cookie nie był, czy pamiętasz, aby usunąć "Okaziciela" z pliku cookie przed sprawdzeniem tokena? – Mike

+0

@Mike i aktualizuję kod serwera, problem polega na tym, że przechodzi bezpośrednio do instrukcji else, co oznacza, że ​​token w ogóle nie istnieje – Hilmanrdn

+0

spróbuj użyć obiektu w nagłówkach ajax: {'X-Auth-Token': token} OR .. headers : { 'Authorization': 'Bearer' + $ .cookie ('token') } TAKŻE SPRÓBUJ możesz dodać nagłówki "Content-Type": "application/json", "Accept": 'application/json' – owaishanif786

Odpowiedz

0

mogę zmienić Cors ustawienie za pomocą pakietu węzła

https://github.com/expressjs/cors 

tak daleko to działa używając go

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