在现代 Web 应用程序中,身份验证是必不可少的。JSON Web Token (JWT) 是一种流行的身份验证方法,它允许在客户端和服务器之间安全地传递身份验证信息。在本文中,我们将介绍如何使用 Hapi 框架来实现 JWT 身份验证。
什么是 JWT?
JSON Web Token (JWT) 是一种开放标准,它定义了一种紧凑且自包含的方式来在网络上安全地传输信息。JWT 是由三部分组成:头部、载荷和签名。
头部包含了 JWT 的类型和使用的算法,例如:
{ "alg": "HS256", "typ": "JWT" }
载荷包含了需要传输的信息,例如用户 ID 和过期时间等:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022, "exp": 1516239122 }
签名是使用头部中指定的算法对头部和载荷进行加密得到的结果。签名可以用来验证 JWT 的完整性和真实性。
Hapi 框架
Hapi 是一个现代化的 Node.js Web 框架,它提供了一些强大的功能,例如路由、插件和身份验证等。Hapi 的设计目标是提供一个可扩展、可维护和易于测试的框架。
实现 JWT 身份验证
下面是一个使用 Hapi 实现 JWT 身份验证的示例代码。
安装依赖
首先,我们需要安装一些依赖:
npm install hapi joi jsonwebtoken hapi-auth-jwt2
hapi
是 Hapi 框架本身。joi
是一个数据验证库,用于验证请求中的数据。jsonwebtoken
是一个用于生成和验证 JWT 的库。hapi-auth-jwt2
是一个 Hapi 插件,用于实现 JWT 身份验证。
创建服务器
接下来,我们需要创建一个 Hapi 服务器,并配置一些基本设置,例如端口号和路由。
// javascriptcn.com 代码示例 const Hapi = require('hapi'); const server = Hapi.server({ port: 3000, host: 'localhost' }); server.route({ method: 'GET', path: '/', handler: (request, h) => { return 'Hello, world!'; } }); async function start() { await server.start(); console.log(`Server running at: ${server.info.uri}`); } start();
在上面的代码中,我们创建了一个 Hapi 服务器,并定义了一个路由,它将发送一个简单的文本响应。
配置身份验证
现在,我们需要配置 Hapi 身份验证插件,以便我们可以使用 JWT 身份验证。
// javascriptcn.com 代码示例 const Hapi = require('hapi'); const Joi = require('joi'); const jwt = require('jsonwebtoken'); const HapiJwt = require('hapi-auth-jwt2'); const server = Hapi.server({ port: 3000, host: 'localhost' }); server.route({ method: 'GET', path: '/', handler: (request, h) => { return 'Hello, world!'; } }); const validate = async (decoded, request, h) => { // 在这里验证 token 是否有效 return { isValid: true }; }; const init = async () => { await server.register(HapiJwt); server.auth.strategy('jwt', 'jwt', { key: 'secret', // 签名密钥,应该保密 validate, // 验证函数 verifyOptions: { algorithms: ['HS256'] } // 验证选项 }); server.auth.default('jwt'); }; init(); async function start() { await server.start(); console.log(`Server running at: ${server.info.uri}`); } start();
在上面的代码中,我们使用 hapi-auth-jwt2
插件来实现 JWT 身份验证。我们定义了一个名为 validate
的验证函数,它将在每个请求中使用。在这个函数中,我们可以验证 JWT 是否有效,并将验证结果返回给 Hapi。
我们还使用 server.auth.strategy
方法来定义身份验证策略。我们将其命名为 jwt
,并使用 jwt
方案来指定我们要使用 JWT 身份验证。我们还提供了一个签名密钥和一些验证选项。
最后,我们使用 server.auth.default
方法来指定默认的身份验证策略。这意味着所有的路由都将使用 JWT 身份验证。
添加路由和控制器
现在,我们可以添加一些需要身份验证的路由和控制器。
// javascriptcn.com 代码示例 server.route({ method: 'POST', path: '/login', options: { auth: false, validate: { payload: Joi.object({ username: Joi.string().alphanum().min(3).max(30).required(), password: Joi.string().required() }) } }, handler: async (request, h) => { const { username, password } = request.payload; // 在这里验证用户名和密码是否正确 const token = jwt.sign({ username }, 'secret', { expiresIn: '1h' }); return { token }; } }); server.route({ method: 'GET', path: '/profile', handler: (request, h) => { return `Welcome, ${request.auth.credentials.username}!`; } });
在上面的代码中,我们添加了两个路由和控制器。第一个路由是 /login
,它用于验证用户名和密码,并返回一个 JWT。我们在路由选项中使用 auth: false
,因为我们不需要身份验证来登录。我们还使用 validate
选项来验证请求中的数据。
第二个路由是 /profile
,它需要身份验证才能访问。我们在控制器中使用 request.auth.credentials.username
来获取当前用户的用户名。
到目前为止,我们已经成功地实现了 JWT 身份验证。现在我们可以使用 Postman 或其他工具来测试我们的 API。
总结
在本文中,我们介绍了 JWT 身份验证和 Hapi 框架,并使用示例代码演示了如何在 Hapi 中实现 JWT 身份验证。我们希望这篇文章能够帮助你更好地理解 JWT 身份验证和 Hapi 框架,并在实际项目中使用它们。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/657f17ced2f5e1655d9f62be