J'utilise node.js et express.js avec le module express-jwt , et j'ai mis en place un simple serveur HTTP pour tout tester:
Voici le code du nœud impliqué:
app.set('port', process.env.PORT || 3000);
app.use(express.methodOverride());
app.use(allow_cross_domain);
app.use('/api', expressJwt({secret: '09qrjjwef923jnrge$5ndjwk'}));
app.use(express.json());
app.use(express.urlencoded());
app.use('/', express.static(__dirname + '/'));
app.use(function(err, req, res, next){
if (err.constructor.name === 'UnauthorizedError') {
res.send(401, 'Unauthorized');
}
});
app.get('login',function(req,res){
//...
jwt.sign(results.username+results.email, secret, { expiresInMinutes: 9000000000*9393939393393939393939 });
});
app.post('api/profile',function(req,res){
console.log(req.user); // this return undefined in console
res.send(req.user); // response is pending and dunno why it returns error in browser console
});
Donc une fois que j'ouvre le /login
URL Je me connecte et j'envoie le jeton de session à api/post
, qui renvoie cette erreur de réponse dans la console du navigateur:
{"error":{"message":"invalid signature","code":"invalid_token","status":401,"inner":{}}}
Je ne comprends pas pourquoi cela se produit, car le jeton stocké dans le front-end et le jeton dans JWT sont les mêmes. Quelle pourrait être la raison de cette erreur?
Un exemple d'en-têtes POST
ed au api/post
URL:
Voici un exemple
http://blog.auth0.com/2014/01/07/angularjs-authentication-with-cookies-vs-token/
var expressJwt = require('express-jwt');
var jwt = require('jsonwebtoken');
var SECRET = 'shhhhhhared-secret';
app.use('/api', expressJwt({secret: SECRET}));
app.post('/authenticate', function (req, res) {
//TODO validate req.body.username and req.body.password
//if is invalid, return 401
if (!(req.body.username === 'john.doe' && req.body.password === 'foobar')) {
res.send(401, 'Wrong user or password');
return;
}
var profile = {
first_name: 'John',
last_name: 'Doe',
email: '[email protected]',
id: 123
};
// We are sending the profile inside the token
var token = jwt.sign(profile, SECRET, { expiresIn: 18000 }); // 60*5 minutes
res.json({ token: token });
});
app.get('/api/protected',
function(req, res) {
res.json(req.user);
});
Assurez-vous également de ne pas mettre de: après porteur. Par exemple.
MAUVAIS! Authorization: Bearer: eyJ0eXAiOiI1NiJ9.eyJpZCMjEyNzk2Njl9.4eU6X1wAQieH
Imprime "UnauthorizedError: jwt must be provided" dans les journaux
Bien Authorization: Bearer eyJ0eXAiOiI1NiJ9.eyJpZCMjEyNzk2Njl9.4eU6X1wAQieH