Я настраиваю 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
}, ... ]
API не должен возвращать какие-либо Данные, если запрос не включает в себя подписанный JWT или вообще без JWT.