Authentifizierten Knoten-API mit Pass-jwt
Ich versuche, setup-JWT-Authentifizierung über passport-jwt. Ich glaube, ich habe die richtigen Schritte unternommen, aber ein test HOLEN wird nicht gelingen und ich weiß nicht, wie zu Debuggen.
Hier ist, was ich getan habe:
- setup Pass-jwt direkt von der doc so viel wie möglich
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 } }); }));
- Hinzugefügt, die eine token-Folge auf meine Benutzer - /login-Endpunkt
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); };
Sah alles gut bis hier. Ich kann das login eines Benutzers (mit Pass local auth) und die Antwort war die ich erhofft...
{
"user": {
"_id": "56c8b5bd80d16ef41ec705dd",
"E-Mail": "[email protected]",
"Passwort": "$2a$10$zd ... etc.",
"__v": 0,
},
"jwtToken": "JWT eyJ0eXAiOiJ .... etc." }
Erstellte ich eine ungeschützte test diese Strecke...
//in my routes file
app.get('/user/tokenTest', user.tokenTest);
Und in meinen controller einen einfachen Endpunkt...
exports.tokenTest = function(req, res) {
console.log(req.headers);
res.send("token test!!");
};
BEKOMMEN und-ing, funktioniert ebenfalls sehr gut.
- Aber dann versuche ich zu schützen, die diese Strecke:
app.get('/user/tokenTest', passport.authenticate('jwt', { session: false }), user.tokenTest);
Nachdem ich tun, nichts aber Traurigkeit. Ich sende eine Anfrage wie diese:
curl -k 'https://localhost:3443/user/tokenTest' -H 'Authorization: JWT eyJ0eXAiOiJ... etc.'
Und immer, immer einen 401:
Unbefugte
Konsole-Protokolle im controller scheint das nicht zu führen, weder die Protokollierung in der passport.use
Strategie-Methode. Ich habe optimiert und gezwickt, aber ich bin ein wenig verloren. Die Pass-jwt doc nur versorgt das Beispiel, und praktisch keine andere Hilfe.
Bitte, bitte, bitte irgendwelche Ideen, entweder ein Fehler, den ich mache, oben, oder zumindest wie man das Debuggen??
app.get
route? Sie sagen, Sie schützten die app.post
route, aber Ihre curl verwendet die GET
Methode.guten Fang. danke. ich versehentlich geschützt, es als post-route. ändern Sie es zu bekommen (siehe edit), ich bin immer noch mit im Grunde das gleiche problem (siehe aktualisierte Fehler).
InformationsquelleAutor user1272965 | 2016-02-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für jede Arme Seele, folgt mir hier: die Pass-jwt doc impliziert, dass die auth-header sollte dann so Aussehen...
Entpuppte irreführend sein (für mich jedenfalls).
Glücklicherweise, Dank dieser Artikel ich war in der Lage zu lernen, wie man den token aufgebaut wird. (Die token-Präfix bis zu den ersten '.' ist die base64-Codierung der Regelung. "JWT" an der front war der Lärm, der verhinderte, dass die Validierung von arbeiten.
Also das Update war die änderung der token zurückgegeben, die von der Benutzer-controller:
Zu den einfacheren:
Puh. Liegt es an mir, oder ist es wirklich jammerschade, wie unzureichend diese Dinge erklärt werden, die in so vielen Knoten package docs??
Haben Sie versucht, verwenden Sie eine andere header-parameter durch die
fromHeader()
option? Ich war nicht in der Lage, um es arbeiten in jeder Hinsicht...diese eine speichern Sie mich weitere Stunden, +1
Du hast mich gerettet :). schlug meine api mit Bearer-TOKEN und schlug meinen Kopf warum es nicht funktioniert.
Das muss so eine Art Versionierung Problem, denn für mich ist es nicht Arbeit, ohne die
"JWT "
Präfix. Im Zweifelsfall versuchen Sie beides, nehme ich an.InformationsquelleAutor user1272965
Bin ich vielleicht zu spät, aber ich hatte ein ähnliches problem, und ich habe eine andere Lösung. Sie können diese
options.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('JWT')
zum extrahieren der JWT token authentication-header mit dem folgenden format:Hier ist die Dokumentation, die ich verwendet habe: https://github.com/themikenicholson/passport-jwt
InformationsquelleAutor Bruno Tavares