2015-05-08 13 views
5

Sto lavorando a un'applicazione MEAN con autenticazione tramite token Web JSON. fondamentalmente su ogni richiesta, sto verificando se l'utente ha un token valido. in tal caso possono passare al percorso, altrimenti vengono restituiti alla pagina di accesso.Node.js/Angular.js Admin route autorizzate

Voglio rendere determinati percorsi/admin/etc ... accessibile solo agli utenti registrati che sono anche admin. Ho impostato una bandiera isAdmin in mongo. Sono nuovo di nodejs e mi chiedo quale sia il modo migliore per verificarlo. Lo faccio sul lato angolare delle rotte? O posso in qualche modo creare token basati su permessi sull'autenticazione? Per avere un riferimento, sto seguendo il codice del libro macchina media, in particolare qui -

https://github.com/scotch-io/mean-machine-code/tree/master/17-user-crm

risposta

2

In primo luogo, le decisioni di autorizzazione deve essere fatto sul lato server. Effettuarlo sul lato client in Angular.js come suggerito è anche una buona idea, ma questo è solo allo scopo di migliorare l'esperienza dell'utente, ad esempio non mostrare all'utente un link a qualcosa a cui non hanno accesso.

Con JWTs, è possibile incorporare affermazioni circa l'utente all'interno del token, in questo modo:

var jwt = require('jsonwebtoken'); 
var token = jwt.sign({ role: 'admin' }, 'your_secret'); 

per mappare i permessi di esprimere percorsi, è possibile utilizzare connect-roles per costruire funzioni di autorizzazione middleware pulite e leggibili. Supponiamo per esempio il vostro JWT viene inviato nell'intestazione HTTP e si ha la seguente (ingenuo) l'autorizzazione middleware:

// Naive authentication middleware, just for demonstration 
// Assumes you're issuing JWTs somehow and the client is including them in headers 
// Like this: Authorization: JWT {token} 
app.use(function(req, res, next) { 
    var token = req.headers.authorization.replace(/^JWT /, ''); 
    jwt.verify(token, 'your_secret', function(err, decoded) { 
     if(err) { 
      next(err); 
     } else { 
      req.user = decoded; 
      next(); 
     } 
    }); 
}) 

Con questo, è possibile applicare la vostra politica di autorizzazione su percorsi, in questo modo:

var ConnectRoles = require('connect-roles'); 
var user = new ConnectRoles(); 

user.use('admin', function(req) { 
    return req.user && req.user.role === 'admin'; 
}) 

app.get('/admin', user.is('admin'), function(req, res, next) { 
    res.end(); 
}) 

Nota che ci sono opzioni migliori per il rilascio & JWTs convalida, come express-jwt, o utilizzando passport in combinazione con passort-jwt