Стратегия веб-токенов JSON - PullRequest
0 голосов
/ 21 октября 2018

Это паспортная функция для извлечения заголовков.Я использую отAuthHeaderWithScheme один, я уже пробовал из AuthHeaderAsBearerToken с токеном на предъявителя.Я не мог заставить это работать несмотря ни на что?

const JwtStrategy = require('passport-jwt').Strategy,
      ExtractJwt = require('passport-jwt').ExtractJwt,
      User = require('../models/user'),
      Config = require('../config/database');


    module.exports = function(passport) {

      let opts = {};

      opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme("JWT");
      opts.secretOrKey = Config.secret;
      //Code only comes until here. 
      passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
        console.log(jwt_payload);//Code never reaches here.
        User.getByUserId({
          id: jwt_payload._id
        }, function(err, user) {
          if (err) {
            return done(err, false);
          }
          if (user) {
            return done(null, user);
          } else {
            return done(null, false);
          }
        });
      }));


    }

Далее идет моя функция getUserById

module.exports.getByUserId = function(id, cb) {
  User.findById(id, cb)
}

Далее, где вызывается выше двух:

router.post('/login', function(req, res) {
  let username = req.body.username;
  password = req.body.password;

  User.getByUserName(username, function(err, user) {
    if (err) {
      throw err;
    }
    if (!user) {
      return res.json({
        success: "false",
        msg: "User not found"
      })
    }
    //if found compareUser to regiestred one
    User.comparePassword(password, user.password, function(err, isMatched) {
      if (err) {
        throw err;
      }
      if (isMatched) {
        const token = jwt.sign(user.toJSON(), CONFIG.secret, {
          expiresIn: 3600 /*Logout in 1 hour*/
        });

        res.json({
          success: "true",
          token: 'JWT ' + token,
          user: user._id,
          email: user.email,
          username: user.username,
        });
      } else {
        return res.json({
          success: "false",
          msg: " Password not Matched"
        });
      }
    });
  });
});

А вот вам и ComparePassword, и getUserByName, если вам нужночтобы увидеть:

module.exports.comparePassword = function(typedPassword, hash, cb) {
  bcrypt.compare(typedPassword, hash, (err, isMatched) => {
    if (err) {
      throw err;
    }
    return cb(null, isMatched);
  })
};

module.exports.getByUserName = function(username, cb) {
  const query = {
    username: username
  }
  User.findOne(query, cb);
}

Секретный ключ везде одинаков, проблема не в этом.Кажется, я не могу понять проблему.

router.get("/profile", passport.authenticate('jwt', {
  session: false
}, function(req, res, next) {
  res.json({
    success: true,
    message: "This is user profile",
    user: req.user
  });
}));

Теперь, выше, как я аутентифицируюсь, используя почтальона и отправляя запрос как тип контента "Авторизация" и токен.Encase, кто-нибудь из вас задается вопросом, я уже пробовал «токен» + токен по схеме носителя.

1 Ответ

0 голосов
/ 10 декабря 2018

Я изменил первый кодовый блок, который я разместил выше, на этот

 const JwtStrategy = require('passport-jwt').Strategy,
        ExtractJwt = require('passport-jwt').ExtractJwt,
        keys = require('./keys'),
        mongoose = require('mongoose'),
        User = require('../models/User');

    const opts = {};
    opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken('Bearer');
    opts.secretOrKey = keys.secretOrKey;


    module.exports = passport => {
        passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
            User.findOne({ id: jwt_payload.sub }, (err, user) => {
                User.findById(jwt_payload.id)
                    .then(user => {
                        if (user) {
                            return done(null, user);
                        }
                        return done(null, false);
                    })
                    .catch(err => console.log(err));
            });
        }))
    };

И второй блок на этот.В основном измените токен с «JWT» на «Носитель».

router.post('/login', (req, res) => {
    const email = req.body.email, password = req.body.password;
    User.findOne({ email: email })
        .then(user => {
            if (!user) {
                res.status(404).json({ msg: 'User not found' })
            }
            //Check password
            bcrypt.compare(password, user.password)
                .then(isMatch => {
                    if (isMatch) {
                        //User found
                        //Create Jwt Payload
                        const payload = {
                            id: user.id,
                            name: user.name,
                            avatar: user.avatar
                        }

                        jwt.sign(
                            payload,
                            keys.secretOrKey,
                            { expiresIn: 3600 },
                            (err, token) => {
                                res.json({
                                    success: true,
                                    token: 'Bearer ' + token
                                });
                            });
                    } else {
                        return res.status(400).json({ password: 'Password do not match' })
                    }
                })
            // .catch(err => console.log(err));

        })
});

Теперь он работает для меня.

...