Как мы можем реализовать панель администратора в nodeJS с express? - PullRequest
1 голос
/ 20 апреля 2020

Я делаю приложение Портфолио с nodeJS и express. Я хочу реализовать панель администратора, с помощью которой я могу создавать, удалять, обновлять и редактировать свои навыки, опыт и т. Д. c, но я не знаю, как сохранить эти маршруты администратора в секрете и какую аутентификацию выполнить. Если мы можем сделать это, поместив аутентификацию Basi c на post, patch, delete route, то как мы будем применять аутентификацию basi c на маршрутах.

index. js

const express = require('express');
const app = express();
var cors = require('cors');

require('./db/mongoose')
const menuRouter = require('./routers/menu')
const skillRouter = require('./routers/skill')
const aboutRouter = require('./routers/About')
const experienceRouter = require('./routers/Experience')
const resumerouter = require('./routers/Resume')
const userRouter = require('./routers/user')
const port = process.env.PORT || 4000;
app.use(express.json());
app.use(cors());

app.use(menuRouter);
app.use(skillRouter);
app.use(aboutRouter);
app.use(experienceRouter);
app.use(resumerouter);
app.use(userRouter)
app.listen(port, () => {
    console.log("Server is runing on port" + port)
});

навык. js

const express = require('express');
const Skill = require('../model/skill');
const router = new express.Router();
router.post('/skill', async (req, res) => {
    const skill = new Skill(req.body);

    try {
        await skill.save();
        res.status(201).send(skill);
    } catch (e) {
        console.log(e);
        res.status(400).send(e);
    }

})
router.get('/skill', async (rq, res) => {

    try {
        const skill = await Skill.find({});
        res.status(201).send(skill);
    } catch (e) {
        res.status(400).send(e);
    }


})

module.exports = router;

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Как указано в комментариях, я бы немного реорганизовал ваш код, он выглядит неопрятно, и вы любезно повторяете каждую строку, которую импортируете маршрут, так что вам также следует делать это лучше ...

У

есть файл index.js в папке /routers с содержимым демо-репо , которое я сделал для другого вопроса StackOverflow

тогда, чтобы отделить вещи, я бы сделать что-то вроде:

const routes = require('./routes')
...
const protectRouteWithApiKey = (req, res, next) => {
    const auth = req.headers['x-apikey']
    if (auth && auth === '<YOUR API KEY>') return next()
    return next(new Error('403 | Authorization is missing or value is wrong'))
}
...
app.use('/api', protectRouteWithApiKey, routes) // point to your routes and protect access
app.use('/', defaultEngine) // your engine to render html

тогда у вас будет защищенный маршрут в /api/* и нормальные маршруты для всего остального

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

Промежуточное программное обеспечение, где вы определяете, является ли зарегистрированный пользователь администратором?

В этом примере проверка по электронной почте позволяет сохранить adminemail в качестве глобальной переменной

ensureAdmin: function(req, res, next) {
    if (req.isAuthenticated()) {
      if (req.user.email === adminemail) {
        return next();
      } else {
        return res.redirect('/adminsecretroute');
      }
    }
    res.redirect('/');
  }
...