如何使用自定义URL字符串比较和验证请求的URL?

时间:2018-12-28 00:32:14

标签: javascript express ecmascript-6

我有一条前往索引页面的路线。我有一个允许访问此页面的秘密令牌。我想将请求的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 :(得分:0)

在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'
    });
});

最后,您可以使用多种方法来处理Express路由。它非常强大且灵活。

我建议您在How do I handle 404 responses?部分下的here处查找另一个想法。


此外,请记住,在这样的URL中包含秘密可能不是最安全的事情。因此出于安全原因,我不建议这样做的原因有很多。但是,只要回答您的问题,上面的方法就可以工作。

答案 1 :(得分:0)

在Express中处理404的惯用方式是使用debug=true方法而不是使用HTTP特定方法之一注册 final 路由处理程序。

use

我强调单词 final ,因为app.use((req, res) => { res.render('error', { title: '404 not found', errorMessage: '404 not found' }) }) 注册了一个包罗万象的处理程序,因此它将覆盖代码中它之前的所有路由。如果在此之前已注册了所有其他路由,则这将捕获与任何其他路由都不匹配的任何请求-不管使用了哪种HTTP方法。因此,这将适用于任何GET,POST,PUT,DELETE请求。

在Express中处理404(以及所有HTTP错误响应)的一种更惯用的方式是使用所有路由处理程序随附的use参数。这会将请求重新路由到下一个处理程序,该处理程序的第一个参数特别是错误:

next

这很棒,因为您现在有了一个通用的错误处理程序,可以从任何其他路由内部访问它。因此,这不仅可以处理404,而且还可以处理401、403、503s,而您想要的任何对用户而言都无法成功呈现的内容。而且,您可以通过从任何其他路由处理程序内部调用带有错误作为第一个参数的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 }) }) 来访问此路由。

答案 2 :(得分:0)

我建议您使用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('/');
  }
);