下面是使用Node.js实现JWT签发和验证的完整攻略:
什么是JWT
JSON Web Token(JWT)是一种开放标准(RFC 7519),用于在各方之间安全地将信息作为JSON对象传输。此信息可以被验证和信任,因为它是数字签名的。JWT通常用于身份验证和授权。
JWT由三个部分组成,它们分别是头部(Header)、载荷(Payload)和签名(Signature),其格式如下:
$header.base64UrlEncode() + "." + $payload.base64UrlEncode() + "." + $signature.base64UrlEncode()
其中,Base64Url Encode是对字符串进行Base64编码后再使用URL规则进行转换得到的结果。签名部分用于确保 JWT 不会被篡改,因此需要对头部和载荷进行数字签名。
安装和引入jsonwebtoken包
首先,需要安装jsonwebtoken包,该包可以用于生成和验证JWT。可以使用以下命令进行安装:
npm install jsonwebtoken
然后,在需要使用jsonwebtoken的地方,可以使用以下代码将jsonwebtoken包引入:
const jwt = require("jsonwebtoken");
JWT的签发
基本使用
下面的代码演示如何使用 Node.js 生成 JWT:
// 定义要签发的JWT
const payload = {
username: "username",
expirationTime: new Date().getTime() + 10 * 60 * 1000 // 10分钟后过期
};
// 生成JWT的签名
const secretKey = "secretKey";
const options = {
expiresIn: "10m"
};
const token = jwt.sign(payload, secretKey, options);
console.log(token);
在上面的代码中,首先定义了要签发的JWT的负载(payload),其中包含了用户名和过期时间信息。然后使用secretKey字符串定义了JWT的密钥。在options参数中指定了JWT的有效期为10分钟。最后使用jwt.sign
方法生成了JWT。
自定义头部
可以使用以下方法设置JWT的头部标签:
// 自定义jwt的头部数据
const header = {
"alg": "HS256",
"typ": "JWT",
"kid": "0001"
};
// 生成JWT的签名
const secretKey = "secretKey";
const options = {
expiresIn: "10m",
header: header
};
const token = jwt.sign(payload, secretKey, options);
console.log(token);
在上面的代码中,使用header
对象来指定JWT的头部标签的内容,并将其包含在options参数中以便传递给jwt.sign
方法。
JWT的验证
验证JWT需要验证其签名是否正确以及其有效期是否未过期,下面是基本使用方法:
// 定义jwt、密钥及选项
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiZXhwaXJhdGlvblRpbWUiOjE2MzAzMzA5NTYsImlhdCI6MTYzMDMzMDY1Nn0.b11WcpiTFHSMswgX5S6pYC2nAjFmUgr6QQGQEFXGmTQ";
const secretKey = "secretKey";
const options = {
algorithms: ["HS256"]
};
// 验证jwt
jwt.verify(token, secretKey, options, function(err, decoded) {
if (err) {
console.log(err);
} else {
console.log(decoded);
}
});
在上面的代码中,使用jwt.verify
方法验证JWT的正确性。options
参数用于指定JWT的算法,decoded
参数用于返回未签名的JWT负载。
示例说明
示例 1:用户登录后签发JWT
下面是一个用户登录后,向客户端返回JWT的代码示例。假设有一个名为 login 的接口,它处理用户输入的用户名和密码并验证。如果验证通过,则生成JWT,并将其发送回客户端。
app.post('/login', (req, res) => {
// 在验证用户名和密码成功后,生成JWT
const payload = { userid: "用户ID" };
const secretKey = "secretKey";
const options = { expiresIn: "1h" };
const token = jwt.sign(payload, secretKey, options);
// 发送JWT到客户端
res.send({ token: token });
});
在上面的代码中,当验证用户名和密码成功时,将生成一个包含user ID的payload,使用secretKey字符串和有效期为 1 小时的选项生成JWT。然后将JWT作为响应发送到客户端。
示例 2:验证JWT是否过期
下面是一个验证JWT是否过期的代码示例。在此示例中,我们使用jwt.verify
方法来验证JWT的有效性和有效期。
// 定义要验证的JWT
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1ODY4NjkxMTJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";
// 定义jwt选项
const secretKey = "secretKey";
const options = {};
// 验证jwt
jwt.verify(token, secretKey, options, function(err, decoded) {
if (err) {
if (err.name === "TokenExpiredError") {
console.log("该JWT已过期");
} else {
console.log("JWT无效,", err.message);
}
} else {
console.log("该JWT有效,有效期到", new Date(decoded.exp * 1000));
}
});
在上面的代码中,使用了jwt.verify
方法来验证JWT的有效性。如果JWT有效,则将其有效期用decoded.exp
返回,如果JWT过期,则err对象的name
属性将是“TokenExpiredError”。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在node中使用jwt签发与验证token的方法 - Python技术站