Я новичок в JS. Я пытаюсь построить аутентификацию с токеном jwt.
У меня в системе 3 пользователя (роль: администратор, врач и пациент). Я передаю идентификатор пользователя и роль пользователя в полезной нагрузке для создания токена. Я передаю их как String.
У меня есть одно промежуточное ПО для аутентификации, которое является auth.js
Я пытаюсь написать другой, который ограничил бы доступ к маршруту (route / api / admin / me) только для администратора. то же самое в adminguard.js. (Я пытаюсь извлечь роль и проверить состояние)
Запросите помощь по второй функции промежуточного программного обеспечения или предложите лучшее решение.
routs / api / systemusers.js - (файл маршрута)
const express = require('express');
const router = express.Router();
const {check,validationResult}=require('express-validator/check');
const SystemUser = require('../../models/SystemUser')
const bcrypt=require('bcryptjs');
const jwt = require('jsonwebtoken');
const config =require('config');
// @ route POST api/systemuser
// @ desc Register user
// @ access Public
router.post('/',[
check('username','please enter username').not().isEmpty(),
check('role','please enter role').not().isEmpty(),
check('password','please enter 6 or more characters').isLength({min:6}).not()
],
async (req,res)=>{
const errors=validationResult(req);
if(!errors.isEmpty()){
return res.status(400).json({errors: errors.array()});
}
const {username, role, password }=req.body;
try {
//check for duplicate username request
let user = await SystemUser.findOne({ username });
if (user) {
return res
.status(400)
.json({ errors: [{ msg: 'User already exists' }] });
}
systemuser = new SystemUser({
username,
role,
password
});
//bcrypt pass word
const salt = await bcrypt.genSalt(10);
systemuser.password=await bcrypt.hash(password, salt);
await systemuser.save();
//return Jsonwebtoken
const payload = {
systemuser: {
id: systemuser.id,
role:systemuser.role
}
};
jwt.sign(
payload,
config.get('jwtSecret'),
(err, token) => {
if (err) throw err;
res.json({ token });
}
);
} catch (err) {
console.error(err.message);
res.status(500).send('Server error');
}
});
module.exports=router;
auth.js (промежуточное ПО)
const jwt = require('jsonwebtoken');
const config = require('config');
module.exports = function(req, res, next) {
// Get token from header
const token = req.header('x-auth-token');
// Check if not token
if (!token) {
return res.status(401).json({ msg: 'No token, authorization denied' });
}
// Verify token
try {
const decoded = jwt.verify(token, config.get('jwtSecret'));
req.user = decoded.user;
next();
} catch (err) {
res.status(401).json({ msg: 'Token is not valid' });
}
};
adminguard.js (промежуточное ПО)
module.exports = function (req, res, next) {
if(req.user && req.user.role !='admin') {
next(new Error('You are not an admin'));
} else {
console.log();
next();
}
}
server.js (основной файл)
const express =require("express");
const connectDB = require('./config/db');
const app=express();
//connect databse
connectDB();
//init middleware
app.use(express.json({ extended: false }));
app.get('/',(req,res)=>res.send('API running'));
//Define routes
app.use('/api/systemusers',require('./routes/api/systemusers'));
app.use('/api/auth',require('./routes/api/auth'));
app.use('/api/admin',require('./routes/api/admin'));
const PORT =process.env.PORT|5000;
app.listen(PORT, ()=>console.log(`Server started on PORT ${PORT}`));
модель / SystemUser
const mongoose= require('mongoose');
const SystemUserSchema=new mongoose.Schema({
username:{
type:String,
required:true
},
role:{
type:String,
required:true
},
password:{
type:String,
required:true
},
date:{
type:Date,
default:Date.now
}
});
module.exports=SystemUser=mongoose.model('systemuser',SystemUserSchema);