expressJWT 阻止公用文件夹,如何解除阻止?

Posted

技术标签:

【中文标题】expressJWT 阻止公用文件夹,如何解除阻止?【英文标题】:expressJWT blocking public folder, how to unblock? 【发布时间】:2018-05-30 15:37:14 【问题描述】:

我的 express/node 后端应用程序和前端应用程序以前是分开的,后端运行在 localhost:3000 上,前端应用程序使用 ng serve 启动并在 localhost:4200 上运行

然而,在我构建了应用程序之后,所有前端的东西都被缩小并放入 /public/ 文件夹中,它们都在端口 3000 上运行。我很确定它们应该像那样工作。由于我正在使用 expressJWT 中间件来保护我的一些没有令牌的访问者的路线,我现在在尝试在浏览器中接收前端应用程序时得到未经授权的 401 .....

如图所示,我可以毫无问题地加载 index.html,我还可以加载所有外部托管源,例如 boots strap 和 jquery 等... 但我自己的 .js 文件是 401。我认为这是因为 expressJWT,但我不完全确定。有谁知道问题是什么以及如何解决?

也可能是express配置错误? 如您所见,我试图像这样“ubnlock”公用文件夹:

 app.use(expressJWT(secret: secret).unless(path : 
 ['/','../public/*','/api/authenticate', '/api/register']))

全程快递:

const express = require("express")
const bodyParser = require("body-parser")
const logger = require('morgan')
const api = require("./api/api")
const path = require('path')
const secret = require('./models/secrets')
const expressJWT = require('express-jwt')
const cors = require('cors');

const app = express()

app.set("json spaces", 2)
app.use(logger("dev"))
app.use(bodyParser.json())
app.use(bodyParser.urlencoded( extended: false ))

// CORS middleware
app.use(cors());

app.use(expressJWT(secret: secret).unless(path : ['/','../public/*','/api/authenticate', '/api/register']))

app.use("/api/", api)

app.get('*', (req,res) => 
  res.sendFile(path.join(__dirname, 'public/index.html'));
);

app.use(function (req, res, next) 
  var err = new Error('Not Found')
  err.status = 404
  next(err)
)

app.use(function (err, req, res, next) 
  console.error(err.status)
  res.status(err.status || 500)
  res.json( msg: err.message, status: err.status )
)

// Body Parser middleware
app.use(bodyParser.json());

// Set static folder
app.use(express.static(path.join(__dirname, 'public')));
//Call this to initialize mongoose
function initMongoose(dbConnection) 
  require("./db/mongooseConnect")(dbConnection)


app.initMongoose = initMongoose

module.exports = app

【问题讨论】:

还可以简化您的应用文件夹结构。我认为路径解析有问题,而不是 jwt。 抱歉,简化我的应用程序文件夹结构是什么意思?如果我注释掉我的行 app.use(expressJWT.......) 那么我可以访问 bundle.js 文件。至少他们不会取消授权 401 .. 而是将他们的内容替换为与 index.html 相同的内容。这引发了一个意外的令牌错误,因为 tehre 突然是 .js 文件中的 html 代码...我检查了公用文件夹中的原始文件,它们包含正确的 javascript 代码。真的很混乱 通常这个包文件是 webpack 加载器文件,并在你构建时生成。在更大的项目中,webpack 配置处理专有的 dist 文件夹,所有资源和页面都可以在延迟加载中访问。此外,您有两个不同的端口在使用中,它需要指定/设置在 index.html 中解析的基本 href。在大多数情况下,'/' 有效。但主要与您的文件夹结构有关。如果一切正常,还要检查“CORS”,也许秘密无法通过不同端口上的标头。 【参考方案1】:

在使用 jwt 之前使用 express 静态中间件。

示例:

app
  .use(express.static(STATIC_PATH))
  .use(
    exjwt( secret: SECRET ).unless(
      path: [/\/api\/v1\/identify/]
    )
  )

【讨论】:

【参考方案2】:

我不是 100% 确定,但我猜你对这条线有疑问。

app.use(expressJWT(secret: secret).unless(path : ['/','../public/*','/api/authenticate', '/api/register']))

app.use("/api/", api)`

试试这个。放单/应该可以解决。

app.use('/api',expressJwt(secret: secret).unless(path: ['/','/public/*','/api/authenticate', '/api/register']);

【讨论】:

以上是关于expressJWT 阻止公用文件夹,如何解除阻止?的主要内容,如果未能解决你的问题,请参考以下文章

expressJWT阻塞公用文件夹,如何解锁?

如何解除浏览器的阻止功能

如何在 Android 上解除对 InputStream.read() 的阻止?

如何阻止对任何文件或 exe vb.net 的访问?

Chrome,firefox解除阻止视频自动播放

阻止直到 NSAlert(显示为模式表)被解除