我设置了一个 Fastify Rest-Api 并编写了一个插件来封装我的基于 JWT 的身份验证逻辑。我在要保护的每条路由上都使用了 preHandler Hook,但似乎 preHandler 或我的插件被忽略了,因为我完全可以在没有令牌的情况下发出请求并获取数据。
我查阅了所有文档,但仍然无法运行。如果我只是 console.log() 我的函数 fastify.authenticate 我得到一个未定义的。
这是我的插件 customJwtAuth:
const fp = require('fastify-plugin')
async function customJwtAuth(fastify, opts, next) {
//register jwt
await fastify.register(require('fastify-jwt'),
{secret: 'asecretthatsverylongandimportedfromanenvfile'})
fastify.decorate('authenticate', async function(request, reply) {
try {
const tokenFromRequest = request.cookies.jwt
await fastify.jwt.verify(tokenFromRequest, (err, decoded) => {
if (err) {
fastify.log.error(err)
reply.send(err)
}
fastify.log.info(`Token verified: ${decoded}`)
})
} catch (err) {
reply.send(err)
fastify.log.error(err)
}
})
next()
}
module.exports = fp(customJwtAuth, {fastify: '>=1.0.0'})
我在我的主 server.js 文件中注册这个插件是这样的:
const customJwtAuth = require('./plugin/auth')
fastify.register(customJwtAuth).after(err => {if (err) throw err})
然后我将这样的功能应用于路线:
const fastify = require('fastify')
const productHandler = require('../handler/productHandler')
const productRoutes = [
{
method: 'GET',
url: '/api/product',
preHandler: [fastify.authenticate],
handler: productHandler.getProducts
}, ... ]
如果请求不包含签名的 jwt 或根本没有 jwt,则 api 不应返回任何数据。