我是JS的初学者。我正在尝试使用 jwt 令牌构建身份验证。
我在系统中有3个用户(角色:管理员,医生
我有一个用于身份验证的中间件,它是auth.js
我试图写另一个将限制路由的(路由/api/admin/me)访问只有管理员。同样是在adminguard.js.(我试图提取角色和检查条件)
请求有关第二个中间件功能的帮助或提出更好的解决方案。
routes/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}`));
型号/系统用户
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);
如果用户不是管理员,我建议返回HTTP 403,而不是使用< code>next:
module.exports = function (req, res, next) {
if(!req.user || req.user.role !='admin') {
res.status(403).send('You are not an admin');
return;
} else {
console.log('User is an admin');
next();
}
}
Laravel auth中间件给我带来了两天的麻烦。 我已经了解了身份验证系统如何使用JWTtoken。在我的控制器中,一切正常,我获得了用户登录,可以使用Auth::guard进行访问- 但我有一个问题在我的中间件Authenticate.php: 我尝试了我在多个帖子或教程中找到的所有内容,但结果是相同的(在控制器中同时所有工作用户都登录): 授权控制器。php Kernel.php 我尝试在
当我试图用日期重命名上传的图像时,一个错误被抛出,它显示“无法读取未定义的属性'isLoggedIn'”。 如果有人能解决这个问题,我会很高兴的。首先感谢Multer,我认为它会抛出一个错误,然后转到错误处理中间件。 下面是我的app.js常量path=require('path');
如何修复这个问题?
问题内容: 这是node.js index.js文件的标头: 这是用于侦听Firestore更改的node.js函数: 这在package.json文件中: 当我尝试执行“ firebase deploy”命令时,这是我得到的错误: 错误:解析函数触发器时发生错误。 TypeError:admin.firestore不是函数 问题答案: 我能够重现错误并强行解决。我对此并不了解,也无法提供有关此解