Я пытался создать внутреннее приложение в 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);
Любая помощь будет благодарна!