📅  最后修改于: 2023-12-03 15:06:39.924000             🧑  作者: Mango
令牌验证在现代 Web 应用程序中越来越受欢迎,特别是在移动应用程序中。NodeJS 是一个强大的平台,可以提供各种令牌验证方案。本文将让你了解令牌验证,并提供一些示例代码。
令牌验证是指验证用户的身份是否得到授权。令牌验证可以通过多种方式实现,但最常见的方式是使用 JSON Web 令牌(JWT)。JWT 是目前最受欢迎的令牌验证方案之一。它允许你在用户和服务器之间传递被加密的信息,以验证用户的身份和权限。
JWT 由三部分组成:
下面是一个示例 JWT,它包含了一个用户 ID 和一个过期时间:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1MTYyMzkxMjJ9.SflKxwRJSMeKKF2QT4fwpMeJf36PoVhd
要在 NodeJS 中验证 JWT,首先需要安装 JWT 模块。打开你的终端,运行以下命令:
npm install jsonwebtoken
在你的 NodeJS 应用程序中,需要引入 JWT 模块,并定义一个密钥:
const jwt = require('jsonwebtoken');
const secret = 'mYs3cr3tK3y';
接下来,将要生成一个新的 JWT。首先,定义负载(Payload)数据:
const payload = {
userId: '12345',
exp: Math.floor(Date.now() / 1000) + (60 * 60 * 24), // 24 hours in seconds
};
然后,调用 jwt.sign()
方法,生成新的 JWT:
const token = jwt.sign(payload, secret);
现在,token
变量包含 JWT。你可以将它发送回客户端,让客户端存储它,并在发送请求时传递给服务器。
接下来,你需要在 NodeJS 中解析和验证 JWT。解析 JWT 很简单,只需调用 jwt.verify()
方法:
const decoded = jwt.verify(token, secret);
decoded
变量包含解密的 JWT 数据。
要验证 JWT 签名,需要将 jwt.verify()
的 options
参数设置为 {algorithms: ['HS256']}
,或者使用其他支持的算法。举个例子:
const decoded = jwt.verify(token, secret, { algorithms: ['HS256'] });
如果 JWT 不是有效的令牌,将会抛出错误。你可以使用 try-catch
语句来捕获此类错误:
try {
const decoded = jwt.verify(token, secret, { algorithms: ['HS256'] });
console.log(decoded); // 输出解密后的 JWT 数据
} catch {
console.log('Invalid token');
}
下面是完整的令牌验证示例代码:
const jwt = require('jsonwebtoken');
const secret = 'mYs3cr3tK3y';
const generateJwt = () => {
const payload = {
userId: '12345',
exp: Math.floor(Date.now() / 1000) + (60 * 60 * 24), // 24 hours in seconds
};
const token = jwt.sign(payload, secret);
return token;
}
const verifyJwt = (token) => {
try {
const decoded = jwt.verify(token, secret, { algorithms: ['HS256'] });
console.log(decoded);
} catch {
console.log('Invalid token');
}
}
const token = generateJwt(); // 生成 JWT
verifyJwt(token); // 解析和验证 JWT
以上是用 NodeJS 实现令牌验证的基础知识,你可以根据自己的需求进行修改和扩展。在实际应用中,你可以使用第三方身份验证服务,例如 Passport 和 Auth0。