我正在创建一个使用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
答案 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文件