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:

  1. 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
        }
      });
    }));
  2. 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.

  1. 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??

Was hast du mit der 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

Schreibe einen Kommentar