Паспорт в NodeJs всегда возвращается UnAuthorized - PullRequest
0 голосов
/ 19 апреля 2020

Я пытался создать внутреннее приложение в nodejs, в котором у меня есть две схемы: пользователи и профиль. Я пытаюсь аутентифицировать его с помощью паспорта, но кажется, что-то не так с кодом. Когда я выполнил это в первый раз, это сработало, но после этого я сделал несколько изменений и, похоже, все испортил, и теперь я не могу выяснить, что не так с моим кодом. Теперь, когда я выполняю маршрут входа в систему почтальона, я получаю токен, но когда я использую этот токен для получения профиля текущего пользователя на основе полезной нагрузки в токене, то даже после добавления токена в заголовок (Авторизация) я получаю несанкционированный доступ. Вот файлы кодов:

приложение. js

const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('./db/mongo');
const passport = require('passport')
const config = require('./config/config')
const setContentTypeJSON = require('./middleware/set-content-type-json');

const usersRouter = require('./routes/auth-routes');

const app = express();

app.use(setContentTypeJSON);
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

//Passport Middleware
app.use(passport.initialize())
require('./config/passport')(passport)


app.use(usersRouter);


const PORT = process.env.PORT || config.port;
mongoose.connect(config.mongoURL, { useNewUrlParser: true })
    .then(() => {
        console.log("Connection established!")
        app.listen(PORT);
    })
    .catch(() => {
        console.log("Connection failed!")
    })

, паспорт. js

const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const mongoose = require('mongoose');
const User = mongoose.model('users');
const keys = require('../config/config');

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

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

auth-маршруты. js

const express = require('express');
const router = express.Router();
const passport = require('passport')
const jwt = require('jsonwebtoken')
const authController = require('../controllers/auth')

router.post("/signup", authController.userSignup);
router.post('/login', authController.userLogin);
router.get('/current', authController.current);

module.exports = router;

auth. js

const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const passport = require('passport');
const config = require('../config/config');
const User = require('../models/user');

exports.userLogin = (req, res, next) => {
    const email = req.body.email;
    const password = req.body.password;

    User.findOne({ email })
        .then(user => {
            if (!user) {
                return res.status(404).json({
                    email: 'User not found'
                })
            }

            bcrypt.compare(password, user.password)
                .then(isMatch => {
                    if (isMatch) { //user login successful
                        const payload = {email: user.email, userId: user._id};
                        jwt.sign(payload,
                            config.secretOrKey,
                            {expiresIn: 3600},
                            (err,token)=>{
                                if(err){
                                    res.status(404).json({
                                        error: err
                                    })
                                }
                                res.json({
                                    success: true,
                                    email: payload.email,
                                    id: payload.userId,
                                    token: 'Bearer '+token,

                                })                               
                            })
                    } else {
                        return res.status(400).json({
                            password: 'Password Incorrect'
                        });
                    }
                })
        });
}

exports.current = passport.authenticate('jwt',
{session: false}),(req,res)=>{
    res.json(req.user)
}

В случае, если вы хотите обратиться Два файла модели, которые я использую для создания схем:

Пользователь. js

const mongoose = require('mongoose')
const uniqueValidator = require('mongoose-unique-validator')


const userSchema = mongoose.Schema({
  email: {type: String, required: true, unique: true},
  password: {type: String,required: true}  ,
  resetToken: String,
  resetTokenExpiration: Date
});

userSchema.plugin(uniqueValidator);

module.exports = mongoose.model("users",userSchema);

Профиль. js

const mongoose = require('mongoose')
const Schema = mongoose.Schema;

const profileSchema = mongoose.Schema({
    user:{
        type: Schema.Types.ObjectId,
        ref: 'users'
    },
    fullname: {
        type: String,
        required: true
    },
    college:{
        type:String,
        required: true
    },
    department: {
        type: String,
        required: true
    },
    achievements:{
        type: [String],
    }
});

module.exports = mongoose.model("profile",profileSchema);

Любая помощь будет благодарна!

1 Ответ

0 голосов
/ 23 апреля 2020

Произошла небольшая ошибка. Здесь в файле auth. js я заменил

exports.current = passport.authenticate('jwt',{session: false}),(req,res)=>{
...
}

на

exports.current = (req,res)=>{
...
}

А в файле auth-маршрутов. js я отредактировал

router.get('/current',passport.authenticate('jwt',{session: false}),authController.current);

Это была ошибка, может быть, мне нужно снова пересмотреть основы es6. Это сработало.

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