【问题标题】:How to serve singular static files in express without exposing full '/static' folder?如何在不暴露完整的“/静态”文件夹的情况下以快递方式提供单个静态文件?
【发布时间】:2019-11-27 19:12:15
【问题描述】:

我正在创建一个使用 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.) 人们这样做的最佳方式是什么?具体来说,是否可以在不使用前端并从后端提供所有静态文件的情况下创建授权的网络应用程序?

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

文件系统

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

【问题讨论】:

    标签: javascript node.js express web backend


    【解决方案1】:

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

    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'))
    

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 这不起作用,当您这样做时,您会从根端点公开公开该目录。我在问题中说过,您不希望该目录中的所有内容都可以公开访问
      • 问题是如果你在html中引用css、js,你不能让它受到JWT令牌的保护,因为浏览器机制不支持它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 2018-03-23
      • 2014-05-24
      • 1970-01-01
      • 2023-03-21
      • 2019-09-19
      • 1970-01-01
      相关资源
      最近更新 更多