node.js - Nodejs身份验证中间件不起作用
问题描述
我正在学习一种使用应用程序级中间件对我的所有 API 进行身份验证的新方法。我查看了多个示例。我尝试了以下代码作为其中一种方法。
下面是我的代码,我正在借助已有的必要字段编写 firebase 函数。我使用“firebase serve”在本地托管我的功能。
const express = require('express')
const bodyParser = require('body-parser')
const cookieParser = require('cookie-parser')()
const cors = require('cors')({ origin: true })
const app = express()
const router = express.Router()
app.use(cors)
app.use(cookieParser)
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
app.use(async (err, req, res, next) => {
console.log('Middleware')
try {
const { authorization } = req.headers
if (!authorization) {
throw new ErrorHandler(401, "User is not unathorized")
}
if (!authorization.startsWith('Bearer')) {
throw new ErrorHandler(401, "User is not unathorized")
}
const split = authorization.split('Bearer ')
if (split.length !== 2) {
throw new ErrorHandler(401, "User is not unathorized")
}
const token = split[1]
const decodedToken = await admin.auth().verifyIdToken(token);
res.setHeader("email", decodedToken.email)
next()
} catch (error) {
console.log("END")
next(error)
}
});
router.get('/', (req, res) => {
res.end(`${Date.now()}`)
})
router.post('/data', async (req, res, next) => {
res.setHeader("Content-Type", "application/json")
console.log('DATA')
try {
// my other logic goes here
res.end()
} catch (error) {
next(error)
}
})
app.use('/api', router)
app.use((err, req, res, next) => {
if (err) {
handleError(err, res);
}
console.log(JSON.stringify(req.body))
});
exports.app = functions.https.onRequest(app)
我创建了一个名为 app 的云函数。我正在使用这样的 API:
http://localhost:5000/app/api/data
我已经编写了一个中间件来授权我所有即将到来的 API。中间件正在获取不记名令牌,并且正在 Firebase 的帮助下验证令牌。
但是当我从邮递员或网络调用“/api/data”这个 API 时,不会调用中间件。出于调试目的,我使用了 console.log 进行检查。
我当前的流程是 POSTMAN -> DATA
我想要的是:
邮递员->中间件(如果经过身份验证)->数据
POSTMAN -> MIDDLEWARE(如果未通过身份验证)-> END
请让我知道我的代码有什么问题。
解决方案
从中间件中删除 err 参数,您将其设置为错误处理程序而不是中间件,这就是代码没有被执行的原因,下面的代码将在您每次访问 /api 路由时执行处理程序
const express = require('express')
const bodyParser = require('body-parser')
const cookieParser = require('cookie-parser')()
const cors = require('cors')({ origin: true })
const app = express()
const router = express.Router()
app.use(cors)
app.use(cookieParser)
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
app.use(async (req, res, next) => {
console.log('Middleware')
try {
const { authorization } = req.headers
if (!authorization) {
throw new ErrorHandler(401, "User is not unathorized")
}
if (!authorization.startsWith('Bearer')) {
throw new ErrorHandler(401, "User is not unathorized")
}
const split = authorization.split('Bearer ')
if (split.length !== 2) {
throw new ErrorHandler(401, "User is not unathorized")
}
const token = split[1]
const decodedToken = await admin.auth().verifyIdToken(token);
res.setHeader("email", decodedToken.email)
next()
} catch (error) {
console.log("END")
next(error)
}
});
router.get('/', (req, res) => {
res.end(`${Date.now()}`)
})
router.post('/data', async (req, res, next) => {
res.setHeader("Content-Type", "application/json")
console.log('DATA')
try {
// my other logic goes here
res.end()
} catch (error) {
next(error)
}
})
app.use('/api', router)
app.use((err, req, res, next) => {
if (err) {
handleError(err, res);
}
console.log(JSON.stringify(req.body))
});
exports.app = functions.https.onRequest(app)
推荐阅读
- python - 如何使用 OpenCV python 计算距离?
- javascript - 如何在不触发重新布局的情况下有效地为 SVG 元素设置动画
- flutter - 检查音频是否已经加载
- java - 如果字符串与正则表达式不完全匹配,我如何忽略字符串?
- spring - 我们可以计算用户在 Spring MVC 应用程序中上传文件时的校验和吗?
- flutter - Flutter Getx:obs变量的初始值设置为null
- docker - 如何使用依赖项获取 quarkus:dev 的 maven 依赖项:go-offline
- swift - AVFoundation 中是否有音乐文件的流派键
- spring-boot - 为什么我的视图没有显示。弹簧靴
- typescript - 使用解码器方法验证 ISO-8061 日期