Как сравнить и проверить запрошенный URL с пользовательской строкой URL? - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть маршрут, который идет на страницу индекса.У меня есть секретный токен, который разрешает доступ к этой странице.Я хочу сравнить запрошенный URL с пользовательской строкой.Текущий используемый URL-адрес - http://localhost:3000/?token=secret, но если я введу http://localhost:3000/as?token=secret, он не отобразит созданную мной страницу с ошибкой 404, а вместо этого скажет Cannot GET /as.Мне интересно, как проверить это и правильно отобразить страницу с ошибкой

app.get('/', (req, res) => {
    console.log(req.url); // /?token=secret
    if (req.url !== `/?token=${websocket_token}`) {
        res.render('error', {
            title: '404 Not Found',
            errorMessage: '404 Not Found'
        });
        return;
    }
});

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Идиоматический способ обработки 404-х в Express состоит в том, чтобы зарегистрировать ваш обработчик маршрута final с помощью метода use вместо использования одного из методов, специфичных для HTTP.

app.use((req, res) => {
  res.render('error', {
    title: '404 not found',
    errorMessage: '404 not found'
  })
})

Я подчеркиваю слово final , потому что use регистрирует универсальный обработчик, поэтому он переопределит любой маршрут, который ему предшествует в вашем коде.Если все остальные ваши маршруты зарегистрированы до этого, то он будет перехватывать любой запрос, который не соответствует ни одному другому маршруту - независимо от используемого метода HTTP.Так что это будет применяться к любому запросу GET, POST, PUT, DELETE.

Еще более идиотский способ в Express обрабатывать 404 (и все ответы об ошибках HTTP) - использовать аргумент next, который поставляется со всемиобработчики маршрута.Это перенаправит запрос следующему обработчику, который определенно принимает ошибку в качестве первого аргумента:

app.use((req, res, next) => {
  const error = new Error('404 not found')
  error.statusCode = 404
  next(error)
})

app.use((error, req, res, next) => {
  res.status(error.status || 500)
  res.render('error', {
    title: error.message,
    errorMessage: error.message
  })
})

Это здорово, потому что теперь у вас есть универсальный обработчик ошибок, к которому вы можете обращаться из любого другогомаршрут.Так что это будет обрабатывать не только 404, но также 401, 403, 503, все, что вы хотите, что не будет успешно отображаться для пользователя.И вы можете получить доступ к этому маршруту, просто вызвав next с ошибкой в ​​качестве первого аргумента из любого другого обработчика маршрута.

0 голосов
/ 28 декабря 2018

Я предлагаю вам использовать passport-auth-token для проверки токена и отображения страниц успеха или ошибок.

Настройка стратегии

Стратегия аутентификации токена аутентифицирует пользователей с помощьюмаркер.Стратегия требует обратного вызова проверки, который принимает эти учетные данные и вызовы, выполненные с предоставлением пользователю.

passport.use('authtoken', new AuthTokenStrategy(
  function(token, done) {
    AccessToken.findOne({
      id: token
    }, function(error, accessToken) {
      if (error) {
        return done(error);
      }

      if (accessToken) {
        if (!token.isValid(accessToken)) {
          return done(null, false);
        }

        User.findOne({
          id: accessToken.userId
        }, function(error, user) {
          if (error) {
            return done(error);
          }

          if (!user) {
            return done(null, false);
          }

          return done(null, user);
        });
      } else {
        return done(null);
      }
    });
  }
));

Аутентификация запросов

Использование passport.authenticate(), указав 'authtoken' стратегия для аутентификации запросов.

Например, в качестве промежуточного программного обеспечения маршрута в приложении Express:

app.post('/login',
  passport.authenticate(
    'authtoken',
    {
      session: false,
      optional: false
    }
  ),
  function(req, res) {
    res.redirect('/');
  }
);
0 голосов
/ 28 декабря 2018

В Express каждый app.get или другой связанный метод обрабатывает свой собственный маршрут.Поэтому, когда вы делаете app.get('/', вы соответствуете только маршрутам, которые / не /as.

. Вы можете изменить его на *, чтобы соответствовать всем маршрутам.Может быть, как в следующем случае:

app.get('*', (req, res) => {
    console.log(req.url); // /?token=secret
    if (req.url !== `/?token=${websocket_token}`) {
        res.render('error', {
            title: '404 Not Found',
            errorMessage: '404 Not Found'
        });
        return;
    }
});

Или, конечно, у вас может быть выделенный раздел для ваших 404 сообщений.

app.get('/', (req, res, next) => {
    console.log(req.url); // /?token=secret
    if (req.url !== `/?token=${websocket_token}`) {
        return next();
    }
    // Valid request
});

app.get('*', (req, res) => {
    res.render('error', {
        title: '404 Not Found',
        errorMessage: '404 Not Found'
    });
});

В конце концов, есть так много способов, которыми вы можетесправиться с экспресс-маршрутизацией.Он очень мощный и гибкий.

Я бы посоветовал вам посмотреть здесь в разделе How do I handle 404 responses? и другую идею.


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...