Hapi 框架中如何使用 hapi-auth-jwt2 来验证 JWT 令牌

在 Web 应用程序中,授权和身份验证是非常重要的一环。JWT(JSON Web Token)是一个开放标准,它可以安全地在不同的应用程序和服务之间传递信息。Hapi 是一个 Node.js Web 应用程序框架,它可以通过使用 hapi-auth-jwt2 插件来验证 JWT 令牌。本文将会介绍如何在 Hapi 框架中使用 hapi-auth-jwt2 插件来验证 JWT 令牌。

什么是 JWT?

JWT 是一种基于 JSON 的开放标准,它定义了一种紧凑且自包含的方式来安全地将信息传递给另一个应用程序或服务。JWT 由三个部分组成:头部、载荷和签名。头部包含了关于 JWT 的元数据,如算法和类型信息。载荷包含了 JWT 所要传递的信息,如用户 ID 和权限。签名则用于验证 JWT 的完整性和真实性。

为什么要使用 JWT?

JWT 具有以下优点:

  • 跨平台:JWT 是基于 JSON 的,因此可以在不同的编程语言和平台之间轻松传递。
  • 安全性:JWT 使用签名来验证令牌的完整性和真实性,因此可以防止数据被篡改或伪造。
  • 无状态:由于 JWT 自包含,因此不需要在服务器端存储会话信息,因此可以轻松扩展应用程序。
  • 可扩展性:JWT 的载荷可以包含任意数量的键值对,因此可以轻松扩展应用程序。

hapi-auth-jwt2 插件

hapi-auth-jwt2 是一个 Hapi 插件,它可以用于验证 JWT 令牌。它使用 JSON Web Token 签名算法来验证令牌,并将有效负载存储在请求对象的 auth.credentials 属性中。它还提供了一些选项来控制验证过程,如指定令牌的密钥、算法和有效期。

如何使用 hapi-auth-jwt2 插件

以下是在 Hapi 框架中使用 hapi-auth-jwt2 插件来验证 JWT 令牌的步骤:

第一步:安装 hapi-auth-jwt2

使用以下命令来安装 hapi-auth-jwt2 插件:

第二步:注册插件

在你的 Hapi 应用程序中注册 hapi-auth-jwt2 插件:

const Hapi = require('@hapi/hapi');
const Jwt = require('hapi-auth-jwt2');

const server = Hapi.server({
    port: 3000,
    host: 'localhost'
});

const validate = async (decoded, request, h) => {
    // Add your validation logic here
    return { isValid: true };
};

const init = async () => {
    await server.register(Jwt);

    server.auth.strategy('jwt', 'jwt', {
        key: 'your-secret-key',
        validate,
        verifyOptions: { algorithms: ['HS256'] }
    });

    server.auth.default('jwt');

    await server.start();
    console.log('Server running on %s', server.info.uri);
};

process.on('unhandledRejection', (err) => {
    console.log(err);
    process.exit(1);
});

init();

第三步:编写验证逻辑

在上面的示例中,我们定义了一个 validate 函数,它用于验证 JWT 令牌。validate 函数接收三个参数:decoded、request 和 h。decoded 参数包含从 JWT 令牌中解码的有效负载。request 参数包含当前请求的信息。h 参数包含处理程序工具箱,可以用于返回响应或重定向到其他 URL。

在 validate 函数中,你需要编写自己的验证逻辑。例如,你可以从数据库中查找用户并检查他们的权限。如果验证成功,validate 函数应该返回一个包含 isValid 属性的对象。如果验证失败,validate 函数应该返回一个包含 isValid 属性和错误消息的对象。

第四步:配置路由

在你的路由配置中,你需要使用 auth 选项来指定需要验证的路由。例如:

server.route({
    method: 'GET',
    path: '/protected',
    handler: (request, h) => {
        return 'This is a protected route';
    },
    options: {
        auth: 'jwt'
    }
});

在上面的示例中,我们使用 auth 选项来指定这个路由需要验证 JWT 令牌。auth 选项的值应该与我们在第二步中定义的 auth.strategy 的名称相同。

第五步:生成 JWT 令牌

在你的应用程序中,你需要生成 JWT 令牌并将其返回给客户端。例如,你可以在用户登录后生成 JWT 令牌并将其作为响应的一部分返回给客户端:

const jwt = require('jsonwebtoken');

server.route({
    method: 'POST',
    path: '/login',
    handler: (request, h) => {
        const token = jwt.sign({ userId: 123 }, 'your-secret-key');
        return { token };
    }
});

在上面的示例中,我们使用 jsonwebtoken 模块来生成 JWT 令牌。我们传递一个包含 userId 属性的对象作为有效负载,并使用我们在第二步中定义的密钥来签名令牌。最后,我们将令牌作为响应的一部分返回给客户端。

总结

在本文中,我们介绍了 JWT 令牌和 hapi-auth-jwt2 插件,并展示了如何在 Hapi 框架中使用 hapi-auth-jwt2 插件来验证 JWT 令牌。通过使用 JWT 令牌和 hapi-auth-jwt2 插件,我们可以安全地在不同的应用程序和服务之间传递信息,并保护我们的应用程序免受未经授权的访问。

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