Autenticación de API de nodo con passport-jwt
Estoy tratando de configurar la autenticación JWT usando passport-jwt. Creo que he tomado los pasos correctos, pero una prueba GET no tendrá éxito y no sé cómo depurarla.
Esto es lo que he hecho:
prepararpasaporte-jwt directamente del documento cuanto más se pueda
var jwtOptions = {
secretOrKey: 'secret',
issuer: "accounts.examplesoft.com", // wasn't sure what this was, so i left as defaulted in the doc
audience: "yoursite.net" // wasn't sure what this was, so i left as defaulted in the doc
};
jwtOptions.jwtFromRequest = ExtractJwt.fromAuthHeader();
passport.use(new JwtStrategy(jwtOptions, function(jwt_payload, done) {
User.findOne({id: jwt_payload.sub}, function(err, user) {
if (err) {
return done(err, false);
}
if (user) {
done(null, user);
} else {
done(null, false);
// or you could create a new account
}
});
}));
Agregué un resultado de token a mi usuario / punto final de inicio de sesión
var jwt = require('jsonwebtoken');
// ...
exports.postLogin = function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) throw err;
if (!user) {
return res.send({ msg: 'Login incorrect' });
}
req.logIn(user, function(err) {
if (err) throw err;
var secretOrKey = jwtOptions.secretOrKey;
var token = jwt.sign(user, secretOrKey, {
expiresIn: 631139040 // 20 years in seconds
});
res.send({ user: user, jwtToken: "JWT " + token });
});
})(req, res, next);
};
Las cosas se veían bien hasta aquí. Puedo iniciar sesión en un usuario (usando la autenticación local de pasaporte) y la respuesta fue una que esperaba ...
{"usuario": {"_id": "56c8b5bd80d16ef41ec705dd", "correo electrónico": "[email protected]", "contraseña": "$ 2a $ 10 $ zd ... etc.", "__v": 0,} , "jwtToken": "JWT eyJ0eXAiOiJ .... etc." }
Creé una ruta de prueba desprotegida como esta ...
// in my routes file
app.get('/user/tokenTest', user.tokenTest);
Y en mi controlador, un punto final simple ...
exports.tokenTest = function(req, res) {
console.log(req.headers);
res.send("token test!!");
};
Y OBTENER eso también funciona bien.
Pero luego trato de proteger esa ruta así:
app.get('/user/tokenTest', passport.authenticate('jwt', { session: false }),
user.tokenTest);
Después de hacer eso, nada más que tristeza. Envío una solicitud como esta:
curl -k 'https://localhost:3443/user/tokenTest' -H 'Authorization: JWT eyJ0eXAiOiJ... etc.'
Y siempre, siempre obtén un 401:
No autorizado
Los registros de consola en el controlador no parecen ejecutarse, ni tampoco iniciar sesión en elpassport.use
método de estrategia He ajustado y ajustado, pero estoy un poco perdido. El documento passport-jwt solo proporciona el ejemplo, y prácticamente no hay otra ayuda.
Por favor, ¿alguna idea sobre un error que estoy cometiendo anteriormente, o al menos cómo proceder para la depuración?