JSON Web Tokens(JWT)是一种流行的身份验证方法,常被用于 web 应用中。Fastify 是一个快速、开放的 web 框架,内置了身份验证插件 fastify-auth,在 Fastify 应用中使用 JWT 进行身份验证非常容易。
JWT 基础
要在 Fastify 中使用 JWT 进行身份验证,首先需要理解 JWT 的基础知识。
JWT 是什么
JWT 是一种开放标准(RFC 7519),定义了一种紧凑、自包含的方式,用于在网络上作为 JSON 对象安全地传输信息。其中包含了被称为“声明”的用户数据,这些数据可以被验证和信任。
JWT 由三部分组成:头部、载荷和签名。头部(Header)包含了令牌的元数据,以及指示签名算法的信息。载荷(Payload)包含了实际的用户数据。签名(Signature)则用于验证载荷的完整性和真实性。
如何生成和验证 JWT
生成 JWT 的过程称为“签名”,验证 JWT 的过程称为“验证”。
签名
为了生成 JWT,需要使用一个密钥,并使用指定的算法对头部和载荷进行签名。签名可以被放置在 JWT 的头部、载荷或签名字段中。
以下是一个示例 JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
上面的 JWT 包含了一个头部,一个载荷和一个签名,它的结构如下所示:
-- -------------------- ---- ------- ------------------------------------ - -- - - --- -------------------------------------------- - -- - - --- ------------------------------------------- - --
验证
为了验证 JWT,需要使用相同的密钥和算法来生成签名,并比较生成的签名与 JWT 中的签名是否相等。如果相等,则说明 JWT 是有效的。
在 Fastify 中使用 JWT 进行身份验证
在 Fastify 应用中使用 JWT 进行身份验证非常容易,只需执行以下步骤:
安装 fastify-auth 和 jsonwebtoken 模块:
npm install fastify-auth jsonwebtoken
导入所需模块:
const fastify = require('fastify')({ logger: true }) const auth = require('fastify-auth') const jwt = require('jsonwebtoken')
注册 fastify-auth 插件:
fastify.register(auth)
定义一个 JWT 路由:
fastify.post('/login', async (request, reply) => { const token = jwt.sign({ username: 'admin' }, 'secret', { expiresIn: '1h' }) reply.send({ token }) })
上述示例使用 JWT 签名用户名为“admin”的用户,然后将令牌作为 JSON 响应发送回客户端。
为路由添加身份验证:
fastify.post('/protected', { preHandler: fastify.auth([fastify.verifyJWT]) }, async (request, reply) => { reply.send({ message: 'Hello World!' }) })
上述示例使用前置处理程序(preHandler)将 fastify.verifyJWT 函数作为验证函数添加到路由中。该函数将根据应用程序中定义的密钥和算法验证 JWT。
为了使响应更具意义,可以将验证函数提取为单独的库或插件,以便在应用程序中轻松重用。
示例代码
下面是完整的 Fastify 应用程序示例,其中包括使用 JWT 进行身份验证的代码。
-- -------------------- ---- ------- ----- ------- - -------------------- ------- ---- -- ----- ---- - ----------------------- ----- --- - ----------------------- -- -- ------------ -- ---------------------- -- --- -- ---------------------- ----- --------- ------ -- - ----- ----- - ---------- --------- ------- -- --------- - ---------- ---- -- ------------ ----- -- -- -- ------ -------------------------- - ----------- --------------------------------- -- ----- --------- ------ -- - ------------ -------- ------ ------- -- -- -- ----- ----- ----- - ----- -- -- - --- - ----- -------------------- ------------------------ --------- -- ---------------------------------- - ----- ----- - ---------------------- --------------- - - -------
以上示例中的路由需要使用 POST 方法进行请求。在生产应用中,建议使用 HTTPS 协议和 SSL/TLS 证书保护请求。此外,建议将 JWT 加密密钥存储在安全的位置,并从环境变量或其他安全配置中加载,以确保最高级别的安全性。
结论
在 Fastify 中使用 JWT 进行身份验证非常容易,只需执行几个简单的步骤即可。使用 JWT 身份验证可以有效地保护 web 应用程序,并为用户提供更安全的体验。使用这种方法时,请务必保持谨慎并使用安全最佳实践。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66ffb9601b0bf82c71cef075