Паспорт NodeJs JWT - PullRequest
0 голосов
/ 10 мая 2018

Я использую nodejs с паспортом Auth JWT. Я могу создать токен JWT, но если я зафиксирую свой маршрут с помощью passport.authenticate ('jwt'), это не сработает, и у меня возникнут ошибки.

Моя ошибка: Ошибка типа: невозможно прочитать свойство '_id' из неопределенного в JwtStrategy._verify (D: \ Programes \ nodejs \ node \ CRUD_NodeAngular5 \ NodeServer \ config \ passport.js: 15: 39) в D: \ Programes \ nodejs \ node \ CRUD_NodeAngular5 \ NodeServer \ node_modules \ passport-jwt \ lib \ Strategy.js: 110: 26 в D: \ Programes \ nodejs \ node \ CRUD_NodeAngular5 \ NodeServer \ node_modules \ passport-jwt \ node_modules \ jsonwebtoken \ verify.js: 27: 18 в _combinedTickCallback (внутренняя / process / next_tick.js: 131: 7) at process._tickCallback (internal / process / next_tick.js: 180: 9)

Passport.js

var JwtStrategy     = require('passport-jwt').Strategy;
var ExtractJwt      = require('passport-jwt').ExtractJwt;

var User            = require('../models/User');
var config          = require('./database');
module.exports = function(passport) {
    var opts = {};
    opts.jwtFromRequest = ExtractJwt.fromAuthHeader();
    opts.secretOrKey = config.secret;
    passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
        User.findById(jwt_payload.$__._id, function(err, user) {
            if (err) {
                return done(err, false);
            }
            if (user) {
                done(null, user);
            } else {
                done(null, false);
            }
        });
    }));
};

Логин

router.post('/login', function(req, res) {
    User.findOne({ email: req.body.email }, function(err, user) {
        if (err) throw err;
        if (!user) {
            res.send({ success: false, message: 'Authentication failed. User not found.' });
            console.log('User not found');
        } else {
            user.comparePassword(req.body.password, function(err, isMatch) {
                if (isMatch && !err) {
                    var token = jwt.sign(user.toJSON(), config.secret, {expiresIn: 1000 }); 
                    var decoded = jwt.decode(token);
                    console.log(decoded);
                    res.json({ success: true, token:'JWT ' + token, decoded:  decoded });
                    console.log('Connected : ' + token);
                } else {
                    res.send({ success: false, message: 'Authentication failed. Passwords did not match.' });
                    console.log('Password is wrong');
                }
            });
        }
    });
});

Route Dashboard Не работает

router.get('/dashboard', passport.authenticate('jwt', { session: false }), function(req, res) {
    res.send('It worked! User id is: ' );
});

1 Ответ

0 голосов
/ 11 мая 2018

позволяет очистить ваш код, это просто: - Шаг 1: создайте файл конфигурации и загрузите туда, где вы храните свои маршруты

var checkAuth = require('../config/check-auth');

Шаг 2: скопируйте и вставьте его в check-auth

const jwt  = require('jsonwebtoken');

    module.exports = (req,res,next)=>{
    try{
        const token  = req.headers.authorization.split(" ")[1];
        const decoded  = jwt.verify(token,"secret");
        req.userData = decoded;
        next();
    }catch(error){
        return res.status(401).json({message:'Auth failed'});
          }
    }

Шаг 3: защитить ваш маршрут

router.get('/dashboard',checkAuth , { session: false }), 
function(req, res) {
    res.send('It worked! User id is: ' );
});

защитить все ваши маршруты, передавая checkAuth в качестве параметра

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...