JWT UnauthorizedError: Pas de jeton d'autorisation a été trouvé (requête GET avec cookie)

J'ai un problème étrange, ou peut-être que je ne comprends pas comment JWT travaille dans l'Express contexte.

var express = require('express')
var app = express();
var expressJWT = require('express-jwt');
var jwt = require('jsonwebtoken');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var unless = require('express-unless');
app.set('secret', 'some secret');
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: false }));
app.use("/", expressJWT({secret:app.get('secret')})
.unless({
path:[
'/',
'/foo',
'/login'
]}
));
//my custom route middleware to verify a token
app.use(function(req, res, next) {
console.log("------------------------------------");
console.log("route middleware to verify a token");
console.log("");
//check header or url parameters or post parameters for token
var token = req.body.access_token || req.query.access_token || req.headers['x-access-token'] || req.cookies.access_token;
console.log("req.cookies.access_token:", req.cookies.access_token);
console.log("token:", token);
//decode token
if (token) {
//verifies secret and checks exp
jwt.verify(token, app.get('secret'), function(err, decoded) {
if (err) {
console.log("jwt.verify ERROR")
return res.json({ success: false, message: 'Failed to authenticate token.', err:err });
} else {
console.log("jwt.verify OK")
//if everything is good, save to request for use in other routes
req.decoded = decoded;
next();
}
});
} else {
//if there is no token
//return an error
return res.status(403).send({
success: false,
message: 'No token provided.'
});
}
});
app.get('/', function (req, res) {
res.send('Hello World!. /foo is open, /bar is protected. Login at /login')
})
app.get('/foo', function (req, res) {
res.send('Foo')
})
app.get('/bar', function (req, res) {
res.send('Foo')
})
app.get('/login', function (req, res) {
var username = 'mock_username';
var myToken = jwt.sign({username:username}, app.get('secret'));
res.cookie('access_token', myToken).send("logged in, check cookie");
})
app.listen(3000, function () {
console.log('Example app listening on port 3000!')
})

Je suis la mise en place d'un JWT jeton et son enregistrement de cookies dans le /login route.
Cela fonctionne, et le jeton est, si je check cookie dans le navigateur (outils de dev de Chrome).

  • Je visite l' /ou /foo route (non protégé comme spécifié avec moins), et le navigateur affiche le résultat correct, mais la console en jette toujours la UnauthorizedError. Pourquoi l'erreur est affiché dans la console si j'ai explicitement marqué ce en tant que route non protégés avec des "si"?

  • Je visite /bar route (protégée), mon middleware n'est pas appelée, je reçois le UnauthorizedError à la fois dans la console et le navigateur. Comment puis-je m'assurer que le middleware est déclenchée ici, et comment dois-je fournir l'accès à cette route si le jeton est en effet trouvé et vérifié dans mon middleware?

  • parce que vous n'avez pas attaché unless avec d'autres middleware.
  • Ceux qui, ceux-là? C'est une réponse à la première question de deux. Veuillez le mettre dans la forme d'une réponse afin que je puisse upvote et vous donnent des points 🙂
InformationsquelleAutor Ska | 2017-01-27