Passport-JWT всегда возвращать 401 несанкционированных - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь аутентифицировать API-интерфейсы nodejs, используя стратегию аутентификации passport-jwt, но она всегда выдает 401 несанкционированную ошибку.Я пробовал разные реализации, но функция passport.authenticate, похоже, просто не работает.

Использование следующих версий паспорта:
"passport": "^ 0.4.0",
"passport-jwt": "^ 4.0.0",

Пожалуйста, смотрите мойкод ниже:

опробованы следующие опции:

jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()  
jwtFromRequest: ExtractJwt.fromHeader('authorization')  
jwtFromRequest: ExtractJwt.fromAuthHeaderWithScheme('Bearer')  
jwtFromRequest: ExtractJwt.fromAuthHeaderWithScheme('jwt')  

но не работает.

пробовал заглядывать passport-jwt 401 Unauthorized и другие ссылки длятакже ссылка.

файл app.js:

const express = require('express');
const bodyParser = require('body-parser');
const passport = require('passport');
const cors = require('cors');

const app = express();
const login = require('./routes/login');

app.use(cors());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
// app.use(passport.initialize());

app.use('/', login);

app.listen(8000, () => console.log('Server running on http://localhost:8000/'));

файл login.js в папке маршрута:

const express = require('express');
const router = express.Router();
const passport = require('passport');
const passportref = require('./../controllers/passport');
const loginController = require('./../controllers/loginController');

router.post('/putemailregistration',loginController.putEmailregistration);
router.get('/login', passportref.authenticate,loginController.verifyLogin);

module.exports = router;

Файл Passport.js:

const passport = require('passport');
const JWTStrategy = require("passport-jwt").Strategy;
const  ExtractJwt = require('passport-jwt').ExtractJwt;
const models = require('./../models');

const opts = {
  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
  secretOrKey: 'incredible',
}
passport.use(new JWTStrategy(opts,async (payload, done) => {
 try {
     console.log(`inside jwt strategy func`);
     const user = models.Userabout.findById({
         where: { email: { [Op.eq]: payload.email } },
         attributes: ['id', 'email', 'password'],
     });
     console.log(`value of user: ${user}`);
     if (typeof user !== 'undefined' && user !== null) {
        return done(null, user);
     }
     else {
        return done(null, false);
     }
 } catch (err) {
     done(err, false);
 }
 }));


module.exports = {
    initialize: () => passport.initialize(),
    authenticate: passport.authenticate("jwt", { session: false }),
};

Файл loginController.js:

const { Op } = require('sequelize');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const models = require('./../models');
const saltRounds = 10;

module.exports.putEmailregistration = async (req, res) => {
  try {
      console.log(`inside put email registration`);

      if (req.body.email === null || req.body.password === null) {
          res.sendStatus(400).json('no data');
      } else {
         const emailregister = await models.Userdata.create({
             email: req.body.email,
             password: bcrypt.hashSync(req.body.password, 
              bcrypt.genSaltSync(saltRounds)),
         });
        const tokenid = jwt.sign({
            id: emailregister.id,
            email: emailregister.email,
        }, process.env.JWT_SECRETKEY,
        { expiresIn: 3600 });
        res.json({ success: true, token: 'bearer ' + tokenid });
     }
   } catch (err) {
    console.log(`error at put email registration: ${err}`);
   }
}


module.exports.verifyLogin = (req, res) => {
  console.log(`i managed to get here`);

  // console.log(`user: ${req.user}`);
 // res.send(req.user.email);
}

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

После долгих отладок я наконец решил проблему.Надеюсь, это может кому-то помочь

  1. По ошибке я указал на неправильную модель в файле passport.js.Это были Userdata вместо Userabout.
  2. В файле loginController.js я изменил, как показано ниже:
    const payload = {id: emailregister.id}
    const token = jwt.sign (payload, jwtOptions.secretOrKey);
  3. Использование опции ниже работало хорошо.
    jwtOptions.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme ('Bearer');
0 голосов
/ 08 апреля 2019

Использование passport.use('jwt',new JWTStrategy({opts},verify_callback(){}) в passport.js

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