2015-05-20 22 views
11

Nel numero express-jwt docs c'è un riferimento alla possibilità di utilizzare una funzione getToken per ottenere il token da una richiesta.Come accedere a getToken in

Come si usa questa chiamata in un percorso?

app.use(jwt({ 
    secret: 'hello world !', 
    credentialsRequired: false, 
    getToken: function fromHeaderOrQuerystring (req) { 
    if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') { 
     return req.headers.authorization.split(' ')[1]; 
    } else if (req.query && req.query.token) { 
     return req.query.token; 
    } 
    return null; 
    } 
})); 
+0

fateci sapere se le nostre risposte hanno aiutato a risolvere il vostro problema o vi indirizzano nella direzione corretta, poiché vorremmo garantire che le nostre risposte siano costruttive e vantaggiose per gli utenti della comunità e per voi stessi. Grazie! – Signus

risposta

1

Come così:

app.get('/protected', 
    jwt({ 
    secret: 'hello world !', 
    credentialsRequired: false, 
    getToken: function fromHeaderOrQuerystring(req) { 
     if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') { 
     return req.headers.authorization.split(' ')[1]; 
     } else if (req.query && req.query.token) { 
     return req.query.token; 
     } 
     return null; 
    } 
    }) 
); 

Basta aggiungere il campo getToken nell'oggetto si passa al middleware JWT. È una combinazione dell'esempio nella domanda e del primo esempio nello documentation.

2

Un piccolo trucco utile è aggiungere unless che rende ogni URL tranne quelli specificati da, a meno che non sia richiesto un token.

Ciò significa che non è necessario creare un app.get per ogni singolo percorso nell'API che si desidera proteggere (a meno che non si vogliano segreti diversi per ciascuno, che non so perché lo si vorrebbe).

var jwt = require('jsonwebtoken'); 
var expressJWT = require('express-jwt'); 

app.use(
    expressJWT({ 
    secret: 'hello world !', 
    getToken: function fromHeaderOrQueryString (req) { 
     if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') 
      return req.headers.authorization.split(' ')[1]; 
     else if (req.query && req.query.token) 
      return req.query.token; 

     return null; 
    } 
    }).unless({ path: ['/login'] })); 

// Test paths 
app.get('/login', function (req, res) { 
    res.send("Attempting to login."); 
}); 

app.get('/otherurl', function (req, res) { 
    res.send('Cannot get here.'); 
}); 

Oppure è sufficiente specificare per un unico percorso:

app.get('/protected', 
    expressJWT({ 
    secret: 'hello world !', 
    getToken: function fromHeaderOrQueryString (req) { 
     if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') 
      return req.headers.authorization.split(' ')[1]; 
     else if (req.query && req.query.token) 
      return req.query.token; 

     return null; 
     } 
})); 

notare il cambiamento da get e use nella configurazione.

Per ogni percorso fornito tramite express-jwt, la funzione getToken viene eseguita se specificato nella configurazione.

La cosa bella dell'aggiunta di unless è che ora hai ridotto al minimo la quantità di lavoro che devi fare per ottenere il token dall'utente per ogni singolo percorso.

Fare riferimento al index.js di express-jwt che ti dice di più su come getToken opere:

  • Se si specifica l'opzione come una funzione, il valore simbolico è il valore restituito della funzione
    • Ciò significa che puoi fornire una logica personalizzata per gestire i tuoi token e potrebbe essere un posto utile per chiamare verify.
  • Altrimenti si corre la logica standard per estrarre il token dalla intestazione di autorizzazione con il formato di '[Autorizzazione Bearer] [Token]' (I denotare la parentesi per mostrare dove si divide la stringa).
Problemi correlati