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 🙂
Vous devez vous connecter pour publier un commentaire.
En spécifiant
unless
, vous avez fait le/
et/foo
route non protégés à partir deapp.use("/", expressJWT(...)
seulement, et non pas à partir de la suitemiddlewares
. La demande va passer à votre custom middlware trop.Parce que, l'application a obtenu s'est écrasé à
app.use("/", expressJWT(...))
, quand il ne pouvait pas trouverauthorization token
. Par conséquent, il ne pouvait pas atteindre votre personnalisé middleware.Solution Possible : 1
Depuis
JWT
jeton est stocké danscookie
dans votre cas, vous pouvez définirgetToken
méthode pour obtenir le jeton et laissezexpress-jwt
afin de la vérifier et supprimer votre personnalisé middleware tout à fait.par exemple
et gérer l'erreur
Solution Possible : 2
Vous pouvez faire la coutume
jwt
vérification par la mise en œuvre de votre personnalisé middleware (que vous avez déjà fait). Il n'est pas nécessaire de la suite middleware à tous.Supprimer la ligne suivante.
Et pour protéger et déprotéger les routes, mettre
unprotected
route avant de la coutume et de middlewareprotected
itinéraire personnalisé middleware (naïve façon).Espère que cela vous aide.