2017-01-20 1 views
8

Я хочу, чтобы я мог использовать маршрутизатор с маркером или без него. Если пользователь имеет маркер, чем дать мне req.userМаршрут доступен с маркером или без него JWT + PASSPORT

Как это:

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

Мое приложение:

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 
    } 
}); 
})); 

Если я пытаюсь получить доступ к /profile без маркера, работает отлично. Но, когда попытка доступа /profile с маркером в заголовке дать мне not loggedIn

Я хочу, чтобы получить доступ к нему даже без маркеров и, если я предоставил затяжку, дай мне пользователь.

ps: Уже проверено с использованием passport.authenticate('jwt') в пути и работает. Если я дам токен, позвольте мне получить доступ, если не дать мне несанкционированный доступ.

ответ

2

Изменить вы маршрутизатор следующим

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

вы должны использовать один из ниже для доступа к данным запроса

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

или

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

объект запроса не имеет атрибута пользователя ,

0

Это, как я это делаю:

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 :('); 
    } 
}); 

Это еще не завершена, если заголовок аутентификации включена, но маркер истек или его недействительным, но она может служить цели. Для меня это было так.

Смежные вопросы