在 Web 应用程序中,JWT(JSON Web Token)是一种常用的认证和授权机制。它使用 JSON 格式对用户进行身份验证并授权访问资源。在验证 JWT 令牌时,我们需要使用一些工具和库来确保它们是有效的,并且没有被篡改或伪造。在 Hapi 框架中,我们可以使用 jwks-rsa 插件来验证 JWT 令牌的签名。
什么是 jwks-rsa 插件?
jwks-rsa 插件是一个 Hapi 插件,用于验证 JWT 令牌的签名。它通过使用公钥密钥对来验证 JWT 令牌的签名,确保它们是有效的并且没有被篡改或伪造。它还支持从远程 JWKS(JSON Web Key Set)端点获取公钥,以便在验证 JWT 令牌时使用。
如何使用 jwks-rsa 插件验证 JWT 令牌?
使用 jwks-rsa 插件验证 JWT 令牌需要以下步骤:
- 安装 jwks-rsa 插件
npm install @hapi/jwks-rsa
- 注册 jwks-rsa 插件
const Hapi = require('@hapi/hapi'); const Jwt = require('@hapi/jwt'); const JwksRsa = require('@hapi/jwks-rsa'); const server = new Hapi.Server({ port: 3000, }); const init = async () => { await server.register([ Jwt, { plugin: JwksRsa, options: { cache: true, rateLimit: true, jwksRequestsPerMinute: 5, jwksUri: 'https://example.com/.well-known/jwks.json', }, }, ]); }; init();
在上面的代码中,我们注册了 Jwt 和 jwks-rsa 插件,并将 jwks-rsa 插件配置为使用远程 JWKS 端点 https://example.com/.well-known/jwks.json
。
- 配置路由
const routes = [ { method: 'GET', path: '/', options: { auth: { strategies: ['jwt'], access: { scope: ['user'], }, }, handler: (request, h) => { return 'Hello, world!'; }, }, }, ]; server.route(routes);
在上面的代码中,我们定义了一个 GET 路由,并使用 auth
选项来指定使用 JWT 认证和授权。我们还指定了 scope
选项来限制访问该路由的用户必须具有 user
范围。
- 创建 JWT 令牌
const Jwt = require('@hapi/jwt'); const token = Jwt.token.generate({ aud: 'https://example.com/api', iss: 'https://example.com/', scope: ['user'], });
在上面的代码中,我们使用 @hapi/jwt
库创建了一个 JWT 令牌,并指定了 aud
、iss
和 scope
声明。
- 发送 JWT 令牌
在发送 JWT 令牌时,我们需要将其添加到 HTTP 请求的 Authorization
头部中。例如:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJodHRwczovL2V4YW1wbGUuY29tL2FwaSIsImlzcyI6Imh0dHBzOi8vZXhhbXBsZS5jb20vIiwic2NvcGUiOlsidXNlciJdfQ.lJx2zr5rYvGgBhLdX9KQf4lZv-Y1id7W8yjKu0pDwSg
- 验证 JWT 令牌
const Jwt = require('@hapi/jwt'); const decoded = Jwt.token.decode(token); const verified = await server.auth.test('jwt', { credentials: decoded.payload, });
在上面的代码中,我们使用 @hapi/jwt
库解码 JWT 令牌,并使用 server.auth.test()
方法验证 JWT 令牌的签名和范围。如果 JWT 令牌有效并且具有正确的范围,verified
将为 true
。
总结
在本文中,我们介绍了如何使用 jwks-rsa 插件验证 JWT 令牌的签名。我们学习了如何安装 jwks-rsa 插件、注册插件、配置路由、创建 JWT 令牌、发送 JWT 令牌和验证 JWT 令牌。通过使用 jwks-rsa 插件,我们可以轻松地验证 JWT 令牌并确保它们是有效的。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65c11b5eadd4f0e0ffb0f29e