javascript - Passport JWT req.user is undefined in one of my routes -
i'm having absolute nightmare trying set jwt express app! think i've got working now, have register route , login route both work correctly , generate valid tokens , have route in '/users' route test authentication , fine. have file containing routes '/api' authentication important , have similar test route tries access req.user (just in other route) seems req.user undefined. through debugging looks user in req.account odd , don't understand why not in req.user
i define jwt strategy in /config/passport.js
'use strict'; const user = require('../models/user'), config = require('./main'), jwtstrategy = require('passport-jwt').strategy, extractjwt = require('passport-jwt').extractjwt; //exported used passport in server set module.exports = function (passport) { const jwtoptions = { // telling passport check authorization headers jwt jwtfromrequest: extractjwt.fromauthheader(), // telling passport find secret secretorkey: config.secret }; const jwtlogin = new jwtstrategy(jwtoptions, function(payload, done) { user.findbyid(payload._id, function(err, user) { if (err) { return done(err, false); } if (user) { done(null, user); } else { done(null, false); } }); }); passport.use(jwtlogin); }
passport passed argument , initialised in main express file
here /users route file, works fine. sending request /users/isauth authorization header , 'jwt ' works fine , username sent me
"use strict"; const express = require('express'), router = express.router(), jwt = require('jsonwebtoken'), user = require('../models/user'), config = require('../config/main'), passport = require ('passport'); function generatetoken(user) { return jwt.sign({_id: user._id}, config.secret, { expiresin: 10080 }); } . . here routes login , register perform expected . , work fine . /* ================================== test authentication route ================================== */ router.get('/isauth', passport.authenticate('jwt', { session: false }), function(req, res) { console.log(req.user); res.json({username: req.user.username}); }); module.exports = router;
in file though, api routes sending request /api/testauth same before same token , same headers no req.user , in console see req.user undefined. in console there seem user object req.account? don't understand happening here can help!
"use strict"; const express = require('express'), router = express.router(), jwt = require('jsonwebtoken'), server = require('../models/server'), passport = require('passport'); // test route see if logged in user matt router.get('/testauth', passport.authorize('jwt', { session: false }), function(req, res) { console.log(req.user); if (req.user) { if(req.user.username == "matt") { res.send("you matt!"); } else { res.send("you not matt!"); } } else { res.send("no req.user"); } }) module.exports = router;
you using passport.authorize
in testauth route, users logged in , have session information. since not using session storage not have persistent req.user
object , should use passport.authenticate
on routes
Comments
Post a Comment