Hapi 框架如何实现 JWT 鉴权?

前言

在现代 Web 应用程序中,安全性是至关重要的。这就是为什么身份验证和授权变得如此重要的原因。JWT(JSON Web Token)是一种流行的身份验证和授权机制,它可以让我们在客户端和服务器之间安全地传输信息。在本文中,我们将探讨如何在 Hapi 框架中实现 JWT 鉴权。

什么是 JWT?

JWT 是一种开放标准(RFC 7519),它定义了一种安全地在客户端和服务器之间传输信息的方式。JWT 包含三个部分:

  • Header:包含令牌的类型和使用的算法。
  • Payload:包含令牌的声明,如用户 ID、角色和过期时间等。
  • Signature:使用密钥对 Header 和 Payload 进行签名,以确保令牌未被篡改。

JWT 的优点在于,它可以在客户端和服务器之间安全地传输信息,而不需要在服务器上存储任何信息。这使得 JWT 成为一种流行的身份验证和授权机制。

Hapi 框架中使用 JWT

Hapi 是一种流行的 Node.js Web 框架,它提供了一种简单且灵活的方式来构建 Web 应用程序。Hapi 框架中使用 JWT 鉴权非常简单。我们需要遵循以下步骤:

安装依赖

首先,我们需要安装依赖。我们需要安装以下依赖:

  • hapi-auth-jwt2:Hapi 的 JWT 鉴权插件。
  • jsonwebtoken:用于生成和验证 JWT 的库。

我们可以使用以下命令安装这些依赖:

注册插件

接下来,我们需要注册 hapi-auth-jwt2 插件。我们可以使用以下代码在 Hapi 应用程序中注册插件:

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

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

const validate = async (decoded, request) => {
    // 在这里验证用户是否有权访问请求的路由
};

const init = async () => {

    await server.register(Jwt);

    server.auth.strategy('jwt', 'jwt', {
        key: 'my-secret-key',          // 用于签名和验证 JWT 的密钥。
        validate: validate,           // 验证函数。
        verifyOptions: { algorithms: ['HS256'] } // 用于验证 JWT 的选项。
    });

    server.auth.default('jwt');

    // 添加路由
    server.route([
        {
            method: 'GET',
            path: '/',
            handler: (request, h) => {
                return 'Hello, World!';
            }
        }
    ]);

    await server.start();
    console.log(`Server running at: ${server.info.uri}`);
};

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

init();

在上面的代码中,我们注册了 hapi-auth-jwt2 插件,并使用 server.auth.strategy() 方法配置了 JWT 鉴权策略。我们还定义了一个验证函数 validate(),它将在每次请求时被调用以验证用户是否有权访问请求的路由。在 server.route() 方法中,我们定义了一个简单的路由,该路由将返回字符串“Hello,World!”。

生成 JWT

接下来,我们需要生成 JWT。我们可以使用以下代码生成 JWT:

const Jwt = require('jsonwebtoken');

const token = Jwt.sign({ userId: 1 }, 'my-secret-key', { expiresIn: '1h' });

在上面的代码中,我们使用 jsonwebtoken 库生成了一个 JWT。我们传递了一个对象,该对象包含用户 ID 和过期时间等声明。我们还传递了一个密钥,用于签名 JWT,以及一个选项对象,该对象包含 JWT 的选项,例如过期时间。

在路由中使用 JWT

最后,我们需要在路由中使用 JWT。我们可以使用 config.auth 属性配置路由的 JWT 鉴权策略。例如,以下代码演示如何在路由中使用 JWT:

const Joi = require('joi');
const Jwt = require('jsonwebtoken');

server.route({
    method: 'GET',
    path: '/protected',
    config: {
        auth: 'jwt',
        handler: (request, h) => {
            return 'Hello, Protected World!';
        }
    }
});

在上面的代码中,我们定义了一个受保护的路由 /protected。我们将 config.auth 属性设置为 'jwt',以指定该路由需要使用 JWT 鉴权。如果请求中未包含有效的 JWT,则该路由将返回 HTTP 401 错误。

总结

在本文中,我们探讨了如何在 Hapi 框架中实现 JWT 鉴权。我们了解了 JWT 的优点和组成部分,以及如何使用 Hapi 插件和 jsonwebtoken 库来实现 JWT 鉴权。我们还演示了如何在路由中使用 JWT 鉴权。希望这篇文章能够帮助您了解 JWT 鉴权的工作原理,并在 Hapi 应用程序中实现安全身份验证和授权。

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


纠错反馈