作为学习NodeJS的一种练习,我正在使用ExpressJS构建一种可响应Web请求的API。截至目前,该程序中包含三个路由,即“ / login”,“ / register”和“ / changePassword”。所有这些方法都不需要处理任何种类的令牌。
但是,我计划添加到程序中的所有其他路由(例如,“ / post”路由)将要求用户使用从POST请求中获得的令牌对自己进行身份验证,以正确的身份登录“ / login”证书。
为了验证令牌,我编写了一个中间件功能:
module.exports.validateToken = function (req,res,next) {
const token = req.headers['x-access-token']
console.log(`validateToken() - TOKEN: ${token}`)
if (token) {
//Make sure the token is valid[...]
next()
}else {
return res.status(401).send({
message: 'Missing token',
success: false
})
}
}
我的问题是,如何将这种中间件仅应用于需要身份验证的路由? 我想过只是创建另一个Router对象,并像这样调用它:
const tokenValidator = require('./util').validate.validateToken
// Router used for any actions that require user-authentication
const authRouter = new app.Router()
authRouter.use(tokenValidator)
但这会完全干扰我的原始无身份验证路由吗?
// Initiate the routes that don't need auth
const routes = require('./routes')(app)
预先感谢,我是一名Java开发人员,所以很多Javascript怪癖让我感到困惑。
答案 0 :(得分:3)
假设您的中间件位于“ ./middleware/auth”中
我将创建应为其应用中间件的基本路由,例如
app.use("/private", require("./middleware/auth"));
这将在以'/ private'开头的任何路由上调用您的身份验证中间件
因此,任何需要身份验证的API控制器都应定义为:
app.use("/private/foo", require("./controllers/foo"));
您的middlware函数将在/ private中的任何路由上被调用,而不会到达您的控制器。
任何不需要您的中间件的应用,都应该简单地停留在“私有” api上下文之外,例如
app.use("/", require("./controllers/somecontroller"));
答案 1 :(得分:2)
在Expressjs中,您添加的每个中间件都会被添加到中间件堆栈中,即FIFO。
因此,如果您有某些路由,而您不希望进行身份验证,则只需将其中间件保持在其他中间件之上即可。
handleAppleEvent:withReplyEvent:
此外,您可以尝试使用nodejs basic-auth模块进行身份验证
希望这会有所帮助!
答案 2 :(得分:0)
express-unless npm软件包可用于此要求。
这允许中间件功能在“除非”满足特定条件的情况下在路径上运行,在这种情况下,它将被跳过。可以设置许多不同类型的条件,method
,path
,ext
和custom
。
要从身份验证中间件中排除某些路径,请使用路径条件。
app.use(requiresAuth.unless({
path: [
'/index.html',
{ url: '/', methods: ['GET', 'PUT'] }
]
}))