随着前后端分离的趋势不断发展,前端的工作越来越复杂。在实现一些复杂的业务逻辑时涉及到身份验证的问题,这时候就需要使用到 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 来进行安装,命令如下:
npm install hapi-jwt
创建 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。例如:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI1YTM1M2QyNDk2MzkzNzI4OGNhZjNlOWUiLCJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE1MTYyMzkwMjJ9.1b7nULB_ICiKj02qJohgOHyL0l_rEo9ac9_3KhxK2yQ
在这个请求头部中,我们使用 Bearer 来指示使用 JWT 进行身份验证,接着添加了一个空格和 Token,该 Token 是我们在创建 Token 时获得的。
接下来,当请求发送到服务器时,Hapi-jwt 插件会自动从请求头部中解析出 Token,并调用 validateUser 函数来验证用户身份。
总结
本文详细介绍了在 Hapi 中使用 JWT 进行身份验证的方法。在实现身份验证前,我们首先介绍了 JWT 的基本概念和构成,接着讲解了如何在 Hapi 中使用 JWT 进行身份验证。通过这篇文章的学习,你可以更好地理解 JWT 技术的原理,并灵活运用到实际项目中。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65acf1cbadd4f0e0ff683018