Fastify 身份验证教程:使用 JSON Web Token(JWT)

Fastify 是一个高效且可扩展的 Node.js Web 开发框架。在 Web 开发中,身份验证是很重要的一部分。本教程将介绍如何使用 JSON Web Token(JWT)实现 Fastify 应用程序中的身份验证。

什么是 JWT?

JSON Web Token(JWT)是一种用于安全地在两个实体之间传递信息的开放标准。它由三部分组成,分别是头部,负载和签名。

头部包含算法和标头类型的信息。负载包含实际要传输的信息,例如用户 ID、访问权限等等。签名用于验证负载是否被篡改。

使用 JWT 的好处是服务器不需要存储用户状态,这有助于减轻服务器的负担。

快速入门

在本节中,我们将创建一个 Fastify 应用并使用 JWT 实现身份验证。假设我们有一个名为 “users” 的集合,其中包含用户的所有信息。为简洁起见,在本教程中将使用 MongoDB。

  1. 首先,安装 Fastify 和 fastify-jwt:
npm install fastify fastify-jwt mongodb
  1. 在 app.js 文件中,创建 Fastify 应用程序并连接到 MongoDB:
const fastify = require('fastify')({ logger: true })
const JWT_SECRET = 'supersecret'

fastify.register(require('fastify-jwt'), { secret: JWT_SECRET })

fastify.register(async function (fastify, opts) {
  const MongoClient = require('mongodb').MongoClient
  const url = 'mongodb://localhost:27017'
  const dbName = 'test-db'

  const client = await MongoClient.connect(url, { useNewUrlParser: true })
  const db = client.db(dbName)

  fastify.decorate('mongo', {
    db,
    users: db.collection('users'),
  })
})

fastify.listen(3000, function (err, address) {
  if (err) {
    fastify.log.error(err)
    process.exit(1)
  }
  fastify.log.info(`server listening on ${address}`)
})
  1. 然后,创建一个路由来处理用户身份验证。在此路由中,将检查用户提供的凭据是否与数据库中的记录匹配。如果验证成功,则向用户提供一个 JWT。
fastify.post('/login', async function (request, reply) {
  const { email, password } = request.body

  const user = await fastify.mongo.users.findOne({ email })

  if (!user) {
    reply.send(401, { message: 'Authentication failed' })
  }

  if (password !== user.password) {
    reply.send(401, { message: 'Authentication failed' })
  }

  const token = fastify.jwt.sign({ id: user._id })

  reply.send({ token })
})
  1. 最后,创建一个受保护的路由。在此路由中,将检查用户提供的 JWT 是否有效。如果有效,则返回受保护的内容。否则,返回 401。
fastify.get('/protected', async function (request, reply) {
  try {
    await request.jwtVerify()
  } catch (err) {
    reply.send(401, { message: 'Authentication failed' })
  }

  reply.send({ message: 'This is a protected route' })
})

完整代码可以在 GitHub 上找到。

总结

本教程介绍了如

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65acd91aadd4f0e0ff66b5e4


纠错反馈