Hapi 中如何使用 JWT 进行身份验证?

随着前后端分离的趋势不断发展,前端的工作越来越复杂。在实现一些复杂的业务逻辑时涉及到身份验证的问题,这时候就需要使用到 JWT 技术。JWT 即 Json Web Token,它是一种轻量级的身份认证和授权规范,能够实现用户在多个服务之间的身份验证。

在 Hapi 中,我们可以利用 JWT 来进行身份验证。接下来,本文将详细介绍如何在 Hapi 中使用 JWT 实现身份验证。

JWT 的基本概念

在介绍如何使用 JWT 进行身份验证前,我们先来了解 JWT 的基本概念。

JWT 是一个基于 JSON 的开放标准(RFC 7519),它包含了三个部分:头部(Header)、载荷(Payload)和签名(Signature)。其中,头部和载荷都是 JSON 格式的数据,而签名是对头部和载荷的一种加密算法得出的字符串。

具体来说,JWT 主要由以下三部分组成:

  • Header:头部包含了两部分信息,分别为加密类型和算法。加密类型通常是 JWT,算法常用的有 HS256、HS384、HS512、RS256、RS384、RS512、ES256、ES384、ES512、PS256、PS384 以及 PS512 等。

  • Payload:载荷是 JWT 实际的内容信息,一般包括三个子部分。分别为存储数据的标准声明(Registered claims)、用户自定义声明(Public claims)以及私有声明(Private claims)。其中存储数据的标准声明主要包括了一些基本的信息,如 JWT 的颁发者、过期时间等。

  • Signature:签名是对头部和载荷的一种加密算法得出的字符串。它用于验证 JWT 的合法性,确保 JWT 未被篡改。

在 Hapi 中使用 JWT 进行身份验证

接下来我们将详细介绍如何在 Hapi 中使用 JWT 进行身份验证。

安装 JWT 插件

首先,我们需要安装 Hapi-jwt 插件来实现 JWT 的身份验证。可以通过 NPM 来进行安装,命令如下:

创建 JWT Token

在实现身份验证前,我们需要先创建一个 JWT Token。可以在用户成功登录后使用 JWT 签名用户信息来创建这个 Token。

const jwt = require('jsonwebtoken');
const secretKey = 'your-secret-key';

const createToken = (user) => {
  const payload = {
    userId: user._id,
    name: user.name
  };

  const options = {
    expiresIn: '1d'
  };

  return jwt.sign(payload, secretKey, options);
};

在这个例子中,我们首先引入了 JWT 模块,然后定义了一个秘钥 secretKey,该秘钥用于对 Token 进行签名。接着定义了一个函数 createToken,该函数用于创建 Token。在函数中,我们定义了一个对象 payload,该对象包含了用户的唯一标识 userId 和用户名 name。然后我们使用 jwt.sign() 方法对这个对象进行签名,并设置了过期时间为 1 天。最后返回了一个 Token。

实现身份验证

在创建 JWT Token 后,我们可以利用 Hapi-jwt 插件来实现身份验证。具体实现代码如下:

const Hapi = require('hapi');
const JwtPlugin = require('hapi-jwt');

const secretKey = 'your-secret-key';

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

const validateUser = (decoded, request, h) => {
    // 在这里实现用户验证逻辑
    return {isValid: true};
};

const start = async () => {
  // 注册 JWT 插件
  await server.register(JwtPlugin);

  // 设置 JWT 验证策略
  server.auth.strategy('jwt', 'jwt', {
    key: secretKey, // 使用的秘钥
    validate: validateUser, // 验证用户的函数
    verifyOptions: { algorithms: [ 'HS256' ] } // 验证的算法
  });

  // 设置默认验证策略
  server.auth.default('jwt');

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

  // 启动服务器
  await server.start();
  console.log('Server running on %s', server.info.uri);
};

start();

在这个例子中,我们首先引入了 Hapi 和 Hapi-jwt 插件。然后定义了一个秘钥 secretKey,该秘钥用于对 Token 进行签名。

接着定义了一个函数 validateUser,该函数用于验证用户。在这个函数中,我们可以实现自己的用户验证逻辑,并返回一个包含 isValid 属性的对象。如果 isValid 为 true,则表示用户验证通过。

在设置 JWT 验证策略时,我们使用 server.auth.strategy() 方法。该方法用于设置一个验证策略,第一个参数为策略的名称,第二个参数为策略类型,第三个参数为配置对象。

在配置对象中,我们设置了使用的秘钥、验证函数 validateUser 以及验证的算法 HS256。在设置默认验证策略时,我们使用 server.auth.default() 方法来设置默认策略。这里我们将默认验证策略设置为 JWT。

最后,我们添加了一个简单的路由,用于测试服务器是否正常启动。

发送请求并进行身份验证

在实现身份验证后,我们可以发送请求来验证身份。在发送请求时,我们需要在请求头部添加一个 Authorization 字段,该字段值为 Token。例如:

在这个请求头部中,我们使用 Bearer 来指示使用 JWT 进行身份验证,接着添加了一个空格和 Token,该 Token 是我们在创建 Token 时获得的。

接下来,当请求发送到服务器时,Hapi-jwt 插件会自动从请求头部中解析出 Token,并调用 validateUser 函数来验证用户身份。

总结

本文详细介绍了在 Hapi 中使用 JWT 进行身份验证的方法。在实现身份验证前,我们首先介绍了 JWT 的基本概念和构成,接着讲解了如何在 Hapi 中使用 JWT 进行身份验证。通过这篇文章的学习,你可以更好地理解 JWT 技术的原理,并灵活运用到实际项目中。

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