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

时间:2017-12-16 19:08:05

标签: angularjs node.js express jwt unauthorized

我的快递/节点后端应用程序和前端应用程序曾经分开,后端运行在localhost:3000上,前端应用程序启动时使用ng服务并在localhost上运行:4200

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

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

也可能表示配置错误了吗? 你可以看到我试图像这样“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

2 个答案:

答案 0 :(得分:0)

我不是百分百肯定,但我猜你有这条线的问题。

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

答案 1 :(得分:0)

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

示例:

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