2017-11-07 2 views
0

Ich habe eine Node.js Express-API, die keine Sicherheit hat und jetzt suche ich auf JWT-basierte Autorisierung zu patchen.Node.js API mit JWT-Authentifizierung

Ich habe es funktioniert (mit dem Code unten) für eine Methode. Gibt es eine einfache Möglichkeit, dies auf alle Methoden anzuwenden? z. B. vielleicht app.all? Oder muss ich den Code zu jeder Methode hinzufügen?

app.get('/people/:id', ensureToken, (req, res, next) => { 
    var id = req.params.id; 
    getPerson(id, (err, people) => { 
    if (err) { 
     next(err); 
     return; 
    } 

    jwt.verify(req.token, process.env.JWT_KEY, function(err, data) { 
     if (err) { 
     res.sendStatus(403); 
     } else { 
     res 
      .status(200) 
      .set('Content-Type', 'application/json') 
      .set("Connection", "close") 
      .send(person); 
     } 
    }); 
    }); 
}); 

function ensureToken(req, res, next) { 
    const bearerHeader = req.headers["authorization"]; 
    if (typeof bearerHeader !== 'undefined') { 
    const bearer = bearerHeader.split(" "); 
    const bearerToken = bearer[1]; 
    req.token = bearerToken; 
    next(); 
    } else { 
    res.sendStatus(403); 
    } 
} 

Antwort

1

Sie können tun, wie:

app.use(function(req, res, next){ 
    const bearerHeader = req.headers["authorization"]; 
    if (typeof bearerHeader !== 'undefined') { 
    const bearer = bearerHeader.split(" "); 
    const bearerToken = bearer[1]; 
    req.token = bearerToken; 
    next(); 
    } else { 
    res.sendStatus(403); 
    } 
}); 
+0

Ah, ich verstehe. Danke für die schnelle Antwort. Ich werde es heute Nacht versuchen – beachCode

+0

Mit diesem werden Sie immer noch "jwt.verify" in Ihrer Route enthalten. – dzm

1

empfehle ich auschecken würde passport-jwt

Sie diese als Middleware als auch verwenden können:

app.get('/people/:id', passport.authenticate('jwt', { session: false }), (req, res, next) => { }); 

Der Vorteil dieser Über die Verwendung von app.use können Sie angeben, welche Routen authentifiziert werden sollen. d. h. Sie können eine Route login oder registration ausschließen. ohne in Schecks hacken wie if (req.path == '/login') Der andere Vorteil ist, dass mit passport Sie später zusätzliche Authentifizierungsmethoden hinzufügen können, sollten Sie wählen. Es gibt auch eine Menge Unterstützung für die Gemeinschaft.

+0

Danke, ich habe es schon als meine langfristige Lösung betrachtet. – beachCode

1

ich setzte es mit app.all, ohne dem Login-Weg vom Check:

app.all(process.env.API_BASE + "*", (req, res, next) => { 
    if (req.path.includes(process.env.API_BASE + "login")) return next(); 

    return auth.authenticate((err, user, info) => { 
     if (err) { return next(err); } 
     if (!user) { 
      if (info.name === "TokenExpiredError") { 
       return res.status(401).json({ message: "Your token has expired. Please generate a new one" }); 
      } else { 
       return res.status(401).json({ message: info.message }); 
      } 
     } 
     app.set("user", user); 
     return next(); 
    })(req, res, next); 
}); 

Die vollständige Lösung hier: https://jonathas.com/token-based-authentication-in-nodejs-with-passport-jwt-and-bcrypt/