2016-07-27 9 views
2

starken TextIch baue node.js + Mongodb Rest api. Ich benutze JWT Benutzerauthentifizierung und ich habe ein Problem. Ich muss Details des authentifizierten Benutzers erhalten (user_id, Name), denke, dass sie vom Token erhalten werden können, aber ich weiß nicht, wie man das tut. Wie ist es möglich?Node.js JWT, erhalten Benutzer-ID von Token

AKTUALISIERT I

router.route('/articles') 

    .post(function (req, res) { 

     var article= new Article();  
     article.user_id = ???; // here needs user_id 
     article.imdb_id = req.body.imdb_id; 
     article.title = req.body.title; 
     article.thumb = req.body.thumb; 

     article.save(function(err) { 
      if (err) 
       res.send(err); 

      res.json({ message: 'Added' }); 
     }); 

    }); 

Ich brauche zum Einfügen in Artikel Sammlung Autoren-ID (user_id) einen Beitrag Anfrage tue, aber ich weiß nicht, wie die authentifizierte User_id zu erhalten.

versucht, dies zu tun:

var token = req.body.token || req.query.token || req.headers['x-access-token']; 

    if (token) { 
    jwt.verify(token, app.get('superSecret'), function(err, decoded) {  
     if (err) { 
     return res.json({ success: false, message: 'Failed to authenticate token.' });  
     } else { 
     req.decoded = decoded; 
     console.log(decoded); 
     next(); 
     } 
    }); 

liefert alle Informationen über Benutzer decodiert (Name, Passwort, _id). Ist es möglich, nur user_id und Namen von hier zu bekommen?

Antwort

0

Wenn Sie ein JSON-Webtoken signieren, können Sie ihm ein Benutzerobjekt übergeben. Hier können Sie die von Ihnen benötigten Benutzerdaten speichern. Dieses Objekt wird dann signiert und codiert und als Token gesetzt. Wenn Sie eine Anforderung an Ihre API senden und den JWT im Auth-Header übergeben, sollte Ihre Validierungsfunktion dieses Benutzerobjekt an Sie zurückgeben, wenn der JWT gültig ist.

Ich verwende gerne das Hapi-Framework für die Erstellung meiner Restful-APIs, daher werde ich ein Beispiel mit Hapi geben.

In Ihrem server.js-Datei benötigen Sie den hapi-auth-jwt2 Paket registrieren:

server.register(require('hapi-auth-jwt2'), (err) => { 
    if (err) { 
     throw err; 
    } 

    server.auth.strategy('jwt', 'jwt', { 
     key: config.jwt.secret, 
     validateFunc: auth.validate, 
     verifyOptions: { algorithms: ['HS256'] } 
    }); 

    server.auth.default('jwt'); 
}); 

Ihre Validierungsfunktion:

export default { 
    validate: (tokenObject, req, callback) => { 
     validateToken(tokenObject.user_id, (err, user) => { 
      if (err) { 
       callback(Boom.unauthorized('User is unauthorized.'), false); 
      } else { 
       req.user = user; 
       callback(null, true); 
      } 
     }); 
    } 
}; 

Das sollte validateToken Funktion den Benutzer nehmen ID, die Sie aus dem Token und Abfrage für den Benutzer. Wenn ein Benutzer gefunden wird, wissen Sie, dass das Token gültig ist, und Sie können den Rest der Benutzerinformationen zurückgeben und speichern.

Um ein Token zu erstellen I "jsonwebtoken" Paket:

generateToken: (user_id, name, callback) => { 
    'use strict'; 
    callback(null, JWT.sign({ 
     user_id: user_id, 
     name: name 
    }, config.JWT.SECRET, { 
     expiresIn: 86400 
    })); 
}