В REST API, Как ограничить доступ к URL из браузера, используя Nodejs & Expressjs - PullRequest
0 голосов
/ 25 октября 2018

У меня есть приложение стека MEAN, и я использую Node.js и Express.js в качестве внутреннего API.

Предполагается, что у меня есть маршрут «комментариев», как указано ниже

/* GET /comments listing. */
router.get("/", function(req, res, next) {
    Comment.find(function(err, comments) {
        if (err) return next(err);
        res.json(comments);
    });
});

Ииспользуйте его на моем сервере следующим образом:

var commentsRouter = require('./routes/comments');
...
app.use('/comments', commentsRouter);

Мой вопрос таков: есть ли способ запретить пользователям доступ к http://mrUrl/comments в браузере и отклонить запрос, возможно, с помощью сообщения 403 Forbidden, но в то же время JavaScriptЕсли файл попытается получить доступ к тому же URL-адресу, он получит сообщение с содержимым (в примере должно быть res.json(comments);)

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

1 Ответ

0 голосов
/ 25 октября 2018

Да, вы можете использовать middleware.

Промежуточное программное обеспечение - это функция, которую вы можете передать до или после выполняемой основной функции (в данном случае GET comments)

порядок расположения функции имеет значение, но стоит на первом месте - сначала выполняется, и вы реализуете его следующим образом:

app.use(myBrowsingRestrictionMiddlewareFunction) // Runs 

app.use('/comments', commentsRouter);

app.use('/account', accountRouter);

Вы также можете использовать в route handler:

app.post('/comments', myMakeSureDataIsAlrightFunction, myMainCreateCommentFunction, myAfterStatusWasSentToClientAndIWishToMakeAnotherInternalActionMiddleware);

Свойства req, res, next передаются в функцию автоматически.

, что означает, что myBrowsingRestrictionMiddlewareFunction получает их, и вы можете использовать их следующим образом:

export function myBrowsingRestrictionMiddlewareFunction(req, res, next) {
  if (req.headers['my-special-header']) {
     // custom header exists, then call next() to pass to the next function
     next();

  } else {

    res.sendStatus(403);      

  }
}

EDIT

В отношении того, где разместить промежуточное программное обеспечение в структуре FS (личное предложение):

Мне нравится отделять маршрутизатор от app.js следующим образом:

app.js

app.use('/', mainRouter);

router.js

const router = express.Router();

router.use(middlewareForAllRoutes);

router.use('/comments', commentsRouter);

router.use(middlewareForOnlyAnyRouteBelow);

router.use('/account', accountRouter);

router.use(middlewareThatWillBeFiredLast); // To activate this, remember to call next(); on the last function handler in your route.

commentsRouter.js

const router = express.Router();

router.use(middlewareForAllRoutesONLYFORWithinAccountRoute);

route.get('/', middlewareOnlyForGETAccountRoute, getAccountFunction);

router.post('/', createAccount);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...