如何在Express中提供单个静态文件而不暴露完整的“ / static”文件夹?

时间:2019-11-27 19:12:15

标签: javascript node.js express web backend

我正在创建一个使用JWT的非常简单的项目。我通过快递服务所有东西,我没有前端和后端。我想做的是根据用户的授权提供特定的html文件(在https://localhost:3000入口点server.js上提供服务)

人们不断建议使用(server.js):

app.use(express.static('static'))

但是这当然不起作用,因为我可以通过转到https://localhost:3000/whatever.i.want访问那些文件中的任何一个。

我也尝试过(server.js):

app.use( '/secret' , authMiddleware, function(req,res){
    if(auth){
      res.sendFile(__dirname + '/static/secret.html')
    }
});

但是在我的样式表和脚本中给出了404,以及一些奇怪的MIME类型错误

拒绝执行https://localhost:3000/script.js作为脚本,因为给出了“ X-Content-Type:nosniff”,并且其Content-Type不是脚本MIME类型。

如果我添加它,它将起作用

app.get( '/styles.css' , function(req,res){
  res.sendFile(__dirname + '/static/styles.css')
});

app.get( '/script.js' , function(req,res){
  res.sendFile(__dirname + '/static/script.js')
});

但是我真的必须对我使用的每个样式表和脚本都这样做吗?必须有更好的方法!!!

1。)人们这样做的最佳方法是什么?具体来说,是否可以在不使用前端的情况下创建授权的Web应用程序,而无需从后端提供所有静态文件?

2。)是否必须公开访问您的静态目录?意味着您只能在某些端点上强制授权约束,然后使用调用这些端点的脚本文件?仍然允许您查看基本的HTML,而不仅仅是API调用的任何结果。哪个有效,但很严重。

文件系统

server.js
/static
  /blah.html
  /secret.html
  /secret.css
  /secret.js

2 个答案:

答案 0 :(得分:0)

如果您想选择性地从快递服务器提供资产,则可以执行以下操作:

let secrets = ['secrets.html', 'my_diary.html']

app.use((req, res, next) => {
    let shouldBeAuthorised = secrets.some(s => req.url.includes(s))
    if (shouldBeAuthorized)
        // check they are authorized to be served this content
    else
        // just serve the content, carry on... no need to worry
})

app.use(express.static('static'))

我对req.url.includes的使用非常不稳定,并且文件列表更加复杂,可能会导致您需要对未明确列入黑名单的文件进行授权...但是上述内容的基本结构代码应该实现您想要实现的目标。

答案 1 :(得分:0)

您可以通过建立一个名为public的文件夹来解决此问题,您可以将所有css,js放在该文件夹中。并使用静态中间件为公用文件夹提供服务

app.use(express.static('public'))

然后还有一个名为secret的文件夹,您将根据用户权限构建路由,验证JWT令牌并提供html文件