如何在NodeJS中实现相同API端点上的部分JWT认证?



我有两个GET请求API,如

app.get('/fruits', async (req, res) => {
let query = {}
const cursor = fruitCollection.find(query)
const fruits = await cursor.toArray()
res.send(fruits)
})
app.get('/fruitsbyemail', verifyJWT, async (req, res) => {
const decodedEmail = req.decoded.email
const email = req.query.email.toLowerCase()
if (decodedEmail === email) {
const query = { email: email }
const cursor = fruitCollection.find(query)
const fruits = await cursor.toArray()
res.send(fruits)
} else {
return res.status(403).send({ message: 'Forbidden Access' })
}
})

我如何将它们合并到一个API中,在那里,我将获得所有水果的列表而不需要认证。但是如果我尝试通过电子邮件获取水果,那么就需要JWT身份验证。

我已经尝试过检查空查询,如果电子邮件是空的,我将获取所有水果,如果有电子邮件存在,我将通过电子邮件获取水果。但问题是,我使用了一个中间函数&;verifyjwt &;在fruitsbyemail API。因此,当我试图合并它们时,验证jwt函数正在工作,并返回401/403。我怎么解决这个问题呢?谢谢你。

TBH我不认为合并公共端点和私有端点是一个好主意,但是如果业务需求证明了这一点,那么我建议创建新的中间件来覆盖这个特殊的用例。创建新的中间件,称为:ConditionallyJwtVerification,并将您的逻辑放在那里。使用您可以访问中间件中的request的事实,并在需要时验证JWT(当存在电子邮件时)。

您可以通过多种方式做到这一点,但是将公共api和经过身份验证的api分开总是好的。

app.get('/fruits', verifyJWT, async (req, res) => {
const decodedEmail = req.decoded.email;
const query = decodedEmail === req.query.email ? {email: req.query.email} : {};
const cursor = fruitCollection.find(query)
const fruits = await cursor.toArray()
res.send(fruits);
})

verifyJWT -你可以检查电子邮件是否存在,否则禁止访问任何请求。

最新更新