2017-01-20 51 views
8

Chcę, abym mógł uzyskać dostęp do routera z tokenem lub bez niego. Jeśli użytkownik posiada żeton, niż dać mi req.userTrasa dostępna z tokenem lub bez niego JWT + PASSPORT

tak:

router.get('/profile', function(req, res) { 
if(req.user) { // or if (req.isAuthenticated()) 
res.send('logged') 
} else { 
res.send('not loggedIn') 
} 
}); 

moim app:

var JwtStrategy = require('passport-jwt').Strategy, 
ExtractJwt = require('passport-jwt').ExtractJwt; 
var opts = {} 
opts.jwtFromRequest = ExtractJwt.fromAuthHeader(); 
opts.secretOrKey = 'sh'; 
passport.use(new JwtStrategy(opts, 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 
    } 
}); 
})); 

jeśli próbuję uzyskać dostęp /profile bez tokena, działa bez zarzutu. Ale, gdy próby uzyskania dostępu /profile z tokena w nagłówku dać mi not loggedIn

chcę uzyskać do niego dostęp, nawet bez tokena, a jeśli dostarczono toke, daj mi użytkownikowi.

ps: Przetestowano już przy użyciu passport.authenticate('jwt') w trasie i działa. Jeśli dam token, daj mi dostęp, jeśli nie daj mi nieuprawnionego.

Odpowiedz

2

Zmień ty routera następująco

router.get('/profile', authenticateUser(), profile()); 

function authenticateUser(req, res, next) { 
    // your strategy here... 
    if (authenticated) { 
    req.user = user; 
    next(); 
    } else { 
    return res.status(401).send("Not authenticated"); 
    } 
} 

function profile(req, res, next) { 
    var userId = req.user.id; 
    User.findById(userId, function(err, user) { 
    if (err) { return res.status(500).json(err); } 
    return res.json(user); 
    }) 
} 
2

należy używać jednego z niżej dostęp do danych żądania

if (req.params.user) {do something...} 

lub

if (req.body.user) {do something...} 

obiekt żądania ma atrybut użytkownika .

0

To jak ja to robię:

const passport = require('passport'); 

const optionalJwt = function (req, res, next) { 
    if (req.headers['authorization']) { 
    return passport.authenticate('jwt', { session: false })(req, res, next); 
    } 
    return next(); 
}; 

app.get('/my/route', optionalJwt, function (req, res, next) { 
    if (req.isAuthenticated()) { 
    res.send('My name is ' + req.user.name); 
    } else { 
    res.send('I\'m not authenticated :('); 
    } 
}); 

Będzie on nadal nie jeśli nagłówek auth jest włączone, ale token wygasł lub jest nieważny, ale może służyć. Dla mnie tak się stało.