Express 4, соответствующий req.path с параметром URL - PullRequest
1 голос
/ 05 марта 2019

Я создал специальное промежуточное программное обеспечение для маршрутизатора Express, которое позволяет мне вносить в белый список определенные конечные точки моего API, которые будут исключены из аутентификации. Однако у меня есть маршрут, где я зависим от параметра URL, и я не могу заставить свое промежуточное программное обеспечение работать так, как задумано. Очевидно, :profileId ничего не делает, и моя конечная точка API все еще требует аутентификации.

Причина, по которой мне нужно исключить этот путь из аутентификации, заключается в том, что мой интерфейс React должен отображать эти данные для всех (без регистрации и входа в систему). Любые советы, как решить эту проблему?

const apiAuth = (req, res, next) => {
  let authRequired = true;

  if (
    req.path == "/api/users/register" ||
    req.path == "/api/users/login" ||
    req.path == "/api/profiles/:profileId"
  ) {
    authRequired = false;
  }

  if (authRequired == true) {
    // Auth check logic
  }
}

1 Ответ

2 голосов
/ 05 марта 2019

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

Включайте ваше промежуточное программное обеспечение для аутентификации только в те маршруты, которые вам требуются:

const authenticationMiddleware = (req, res, next) => {
    // your login check logic
}

router.get('/api/users/me', authenticationMiddleware, (req, res, next) => {
    // your route logic, this endpoint now requires you to be logged in, as you have specified your authentication middleware in the declaration,
})

router.get('/api/profiles/:profileId', (req, res, next) => {
     // your route logic, this endpoint does not require you to be logged in as you have not put the middleware in the route delcaration
})

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

router.get('/api/profiles/:profileId', (req, res, next) => {
    // your route logic, this endpoint does not require you to be logged as we have not told our router to use the middleware yet
})

router.use(authenticationMiddleware)

router.get('/api/users/me', (req, res, next) => {
    // your route logic, this endpoint now requires you to be logged in, as the router has been told to use the middleware at this point.
})

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

Это решает проблему необходимости объявлять список или массив маршрутов, которые требуют или не требуют определенного этапа аутентификации и т. Д.

Вам также необходимо убедиться, чтопозвоните next() в ваше промежуточное ПО, если вы хотите, чтобы оно работало, так как это говорит Express, чтобы он продолжал просматривать все имеющиеся у него маршруты / промежуточное ПО.

...