在 Fastify 中使用 JWT 进行身份验证
JWT(JSON Web Token)是一种用于在网络应用程序中传递身份验证和授权信息的开放标准。它在前端和后端之间传递信息时,能够确保数据的安全性和完整性。在本文中,我们将探讨如何在 Fastify 中使用 JWT 进行身份验证。
- 安装 Fastify 和 JWT
在开始之前,我们需要先安装 Fastify 和 JWT。可以使用以下命令进行安装:
npm install fastify npm install jsonwebtoken
- 创建 Fastify 应用程序
接下来,我们将创建一个 Fastify 应用程序并设置路由。我们将创建一个名为 "/login" 的路由,它将接收用户名和密码,并返回一个 JWT。
// javascriptcn.com 代码示例 const fastify = require('fastify')() fastify.post('/login', (request, reply) => { const { username, password } = request.body // 在此处进行身份验证 const token = jwt.sign({ username }, 'secret') reply.send({ token }) }) fastify.listen(3000, (err) => { if (err) { console.log(err) process.exit(1) } console.log('Server running at http://localhost:3000') })
在上面的代码中,我们使用 fastify.post()
方法创建了一个 POST 请求路由,它将接收一个包含用户名和密码的请求体。在此处,我们还没有进行身份验证,稍后将会进行。
在路由中,我们使用 JWT 的 jwt.sign()
方法来创建一个新的 JWT。该方法接受两个参数:第一个参数是一个对象,它包含要在 JWT 中存储的信息;第二个参数是一个字符串,它是用于加密 JWT 的密钥。
- 进行身份验证
现在我们将在 "/login" 路由中进行身份验证。我们将使用一个简单的用户名和密码验证来演示这一点。在实际应用程序中,您可能会使用更复杂的验证方法,例如使用数据库或 OAuth2。
// javascriptcn.com 代码示例 fastify.post('/login', (request, reply) => { const { username, password } = request.body if (username === 'admin' && password === 'password') { const token = jwt.sign({ username }, 'secret') reply.send({ token }) } else { reply.status(401).send({ message: 'Invalid credentials' }) } })
在上面的代码中,我们检查用户名和密码是否正确。如果是,我们创建一个新的 JWT 并将其返回给客户端。如果不正确,我们返回一个 401 Unauthorized 响应。
- 验证 JWT
现在我们已经创建了一个 JWT 并将其发送给客户端,我们需要验证它以确保它是有效的。我们将使用 JWT 的 jwt.verify()
方法来验证 JWT。
// javascriptcn.com 代码示例 fastify.get('/protected', (request, reply) => { const authorizationHeader = request.headers.authorization if (!authorizationHeader) { reply.status(401).send({ message: 'Authorization header missing' }) return } const token = authorizationHeader.replace('Bearer ', '') try { const decoded = jwt.verify(token, 'secret') reply.send({ message: `Hello, ${decoded.username}!` }) } catch (err) { reply.status(401).send({ message: 'Invalid token' }) } })
在上面的代码中,我们创建了一个名为 "/protected" 的 GET 请求路由。在此路由中,我们首先检查请求头中是否包含授权信息。如果没有,我们返回一个 401 Unauthorized 响应。
如果请求头中包含授权信息,我们提取 JWT 并使用 jwt.verify()
方法进行验证。如果 JWT 是有效的,我们将向客户端发送一条消息,其中包含 JWT 中存储的用户名。如果 JWT 无效,我们返回一个 401 Unauthorized 响应。
- 示例代码
最后,这里是完整的示例代码:
// javascriptcn.com 代码示例 const fastify = require('fastify')() const jwt = require('jsonwebtoken') fastify.post('/login', (request, reply) => { const { username, password } = request.body if (username === 'admin' && password === 'password') { const token = jwt.sign({ username }, 'secret') reply.send({ token }) } else { reply.status(401).send({ message: 'Invalid credentials' }) } }) fastify.get('/protected', (request, reply) => { const authorizationHeader = request.headers.authorization if (!authorizationHeader) { reply.status(401).send({ message: 'Authorization header missing' }) return } const token = authorizationHeader.replace('Bearer ', '') try { const decoded = jwt.verify(token, 'secret') reply.send({ message: `Hello, ${decoded.username}!` }) } catch (err) { reply.status(401).send({ message: 'Invalid token' }) } }) fastify.listen(3000, (err) => { if (err) { console.log(err) process.exit(1) } console.log('Server running at http://localhost:3000') })
- 总结
在本文中,我们介绍了如何在 Fastify 中使用 JWT 进行身份验证。我们创建了一个名为 "/login" 的路由,它接收用户名和密码并返回一个 JWT。我们还创建了一个名为 "/protected" 的路由,它验证 JWT 并向客户端发送一条消息。
使用 JWT 进行身份验证是一种简单而有效的方法,可以确保数据的安全性和完整性。在实际应用程序中,您可能需要使用更复杂的身份验证方法,例如 OAuth2。但是,使用 JWT 作为基础是一个很好的起点。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/656d6df4d2f5e1655d5b2060