在 Web 应用程序中,身份验证是非常重要的。而一种流行的身份验证方式是 JSON Web Tokens(JWTs)。在 Hapi.js 中,使用 JWTs 进行身份验证也是非常简单的。本文将介绍 Hapi.js 中 JWT 验证的基本原理、使用方法、实现方式以及相关问题。
什么是 JWT?
JSON Web Token(JWT)是一种用于在网络应用之间安全传递声明的基于 JSON 的开放标准。JWT 可以通过网络传输,并且用于验证传输的数据是否经过了身份验证和是否可以信任。通常被用于登录认证、单点登录等场景。
在 JWT 中,有三个部分:
- Header(头部):存储 JWT 使用的算法和类型信息。
- Payload(负载):存储包含声明(claims)信息和其他数据。
- Signature(签名):使用密钥对 Header 和 Payload 进行签名生成的一段字符串,用于验证数据的完整性。
使用 JWT 的好处是,可以将用户信息存储在 JWT 中,而不需要再发起一次数据库查询。这样,就可以减轻服务器的负担。
使用 Hapi.js 实现 JWT 验证
Hapi.js 是一个构建 Web 应用的 Node.js 框架,它提供了非常方便的 JWT 验证功能。下面是一个使用 Hapi.js 实现 JWT 验证的示例代码:
// www.javascriptcn.com code example
const Hapi = require('@hapi/hapi');
const HapiAuthJwt = require('hapi-auth-jwt2');
const server = Hapi.server({
port: 3000,
host: 'localhost'
});
// 定义 JWT 的密钥
const jwtSecret = 'my-secret-key';
// 定义用户信息
const users = {
admin: {
id: 1,
name: 'Admin'
}
};
// 定义 JWT 验证的方法
const validateUser = async (decoded, request, h) => {
const { id } = decoded;
const user = users[id];
if (!user) {
return { isValid: false };
}
return { isValid: true };
};
const init = async () => {
// 注册 HapiAuthJwt 插件
await server.register(HapiAuthJwt);
// 定义 JWT 验证的策略
server.auth.strategy('jwt', 'jwt', {
key: jwtSecret,
validate: validateUser
});
// 定义需要进行 JWT 验证的路由
server.route([
{
method: 'GET',
path: '/',
handler: (request, h) => {
return 'Hello, World!';
},
options: {
auth: 'jwt'
}
}
]);
await server.start();
console.log(`Server running on ${server.info.uri}`);
};
process.on('unhandledRejection', (err) => {
console.error(err);
process.exit(1);
});
init();以上代码中,我们首先定义了 JWT 的密钥和用户信息。接着,编写了一个 validateUser 方法,用于验证 JWT 是否合法。最后,使用 server.auth.strategy 方法定义了一个 JWT 验证的策略,并将其应用到路由中。
处理 JWT 过期
一般情况下,JWT 都会设置过期时间,以避免某个 JWT 被一直使用而不会过期,导致安全问题。在 Hapi.js 中,可以使用 jwt 验证策略的 options 参数来设置 JWT 的过期时间:
server.auth.strategy('jwt', 'jwt', {
key: jwtSecret,
validate: validateUser,
options: {
expiresIn: '30m'
}
});在以上代码中,expiresIn 参数用于设置 JWT 的过期时间,此处设置为 30 分钟。如果 JWT 已经过期,则该 JWT 将不再被验证。
处理路由级别的权限
在有些场景中,只有特定角色的用户才有权限访问某些页面或 API。在 Hapi.js 中,可以通过修改 validateUser 方法来实现这一功能。例如,我们可以在 users 对象中增加一个 role 字段,然后在 validateUser 方法中判断该用户是否具有访问权限:
// www.javascriptcn.com code example
const users = {
admin: {
id: 1,
name: 'Admin',
role: 'admin'
},
user: {
id: 2,
name: 'User',
role: 'user'
}
};
const validateUser = async (decoded, request, h) => {
const { id } = decoded;
const user = users[id];
if (!user) {
return { isValid: false };
}
if (user.role !== 'admin') {
return { isValid: false };
}
return { isValid: true };
};通过以上代码,我们只允许具有 admin 角色的用户访问该路由。
小结
在本文中,我们介绍了在 Hapi.js 中使用 JWT 进行身份验证的方法。JWT 不仅可以传递用户信息,而且还可以减轻服务器的负担。使用 Hapi.js 实现 JWT 验证非常简单,只需要使用 HapiAuthJwt 插件并定义策略即可。如果需要处理路由级别的权限,修改 validateUser 方法即可。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d61985a941bf7134bb9fb9