随着前端技术的飞速发展,越来越多的应用程序需要通过 API 与服务器进行交互。而 API 的安全性成为了一个不可忽视的问题。在这篇文章中,我们将介绍如何使用 Hapi 和 JWT 实现基于 token 的 API 授权。
什么是 JWT?
JWT(JSON Web Token)是一种用于在网络上安全地传输信息的开放标准。它可以将数据编码为 JSON 格式,然后将其签名以保证数据的完整性和安全性。JWT 通常用于身份验证和授权。
一个 JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。头部和载荷都是 JSON 对象,签名是由头部和载荷组成的字符串通过一定算法计算得出的。
为什么要使用 JWT?
使用 JWT 有以下几个优点:
- 可以通过 JWT 传递用户认证信息,而无需在服务器端存储用户的认证信息,这样可以减轻服务器的负担。
- JWT 是无状态的,也就是说服务器不需要在自己的内存中保存任何信息,这样可以方便扩展。
- JWT 是基于标准的,这意味着可以在不同的语言和平台之间进行交互。
如何在 Hapi 中使用 JWT?
在 Hapi 中使用 JWT 需要安装 hapi-auth-jwt2 插件。首先我们需要安装插件:
npm install hapi-auth-jwt2
然后在服务器启动时注册插件:
// javascriptcn.com 代码示例 const Hapi = require('@hapi/hapi'); const JWT = require('jsonwebtoken'); const HapiJWT = require('hapi-auth-jwt2'); const server = Hapi.server({ port: 3000, host: 'localhost' }); server.register(HapiJWT, err => { if (err) { console.log(err); } server.auth.strategy('jwt', 'jwt', { key: 'my_secret_key', validate: async (decoded, request, h) => { // 在这里进行用户认证,如果认证成功则返回 true,否则返回 false return { isValid: true }; }, verifyOptions: { algorithms: ['HS256'] } }); server.route({ method: 'GET', path: '/api', config: { auth: 'jwt' }, handler: (request, h) => { return { message: 'Hello World!' }; } }); }); server.start();
在这个例子中,我们使用了 Hapi 的 auth.strategy 方法来定义了一个名为 'jwt' 的认证策略。在 validate 函数中,我们可以进行用户认证的逻辑,如果认证成功则返回 true,否则返回 false。
在路由配置中,我们将 auth 属性设置为 'jwt',这样就可以要求用户在访问该路由之前先进行认证。如果用户没有提供有效的 JWT,则会返回 401 错误。
如何生成 JWT?
在 Hapi 中生成 JWT 非常简单,我们只需要使用 jsonwebtoken 库即可。以下是一个生成 JWT 的例子:
const JWT = require('jsonwebtoken'); const token = JWT.sign({ username: 'admin' }, 'my_secret_key', { expiresIn: '1h' });
在这个例子中,我们使用 JWT.sign 方法生成了一个 JWT。第一个参数是一个对象,表示需要编码的数据。第二个参数是一个字符串,表示签名密钥。第三个参数是一个对象,用于设置 JWT 的过期时间等信息。
总结
在本文中,我们介绍了如何使用 Hapi 和 JWT 实现基于 token 的 API 授权。JWT 具有无状态、跨语言等优点,非常适合用于 API 授权。使用 hapi-auth-jwt2 插件可以简化 JWT 的使用,让我们更加专注于业务逻辑的实现。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/657955cad2f5e1655d35c18d