我正在nodejs/expressjs中处理API,现在我正在使用“JWT令牌”,为此我创建了用于“生成JWT令牌”的函数,现在我想验证该令牌,但我收到以下错误
JsonWebTokenError: jwt malformed
下面是我的当前代码
const secretKey = 'mySecretKey';
const logins = async (req, res) => {
const user = { id: 123, phoneNumber:'123XXXXXXXX' };
// Create a JWT token with the user payload and the secret key
const token = jwt.sign(user, secretKey);
// Return the token to the client
res.json({ token });
}
function verifyToken(req, res, next) {
const token = req.body.token;
if (token) {
const decode = jwt.verify(token, "secret");
res.json({
login: true,
data: decode,
});
} else {
// Return response with error
res.json({
login: false,
data: "error",
});
}
}
关于这个我有几个问题
1) How can we create a common function for all other APIs ( if the token does not match then display an error)
2) How can we verify the token?
4条答案
按热度按时间pgx2nnw81#
欢迎来到StackOverflow!
jwt.verify();
方法,将第一个参数传递为您正在请求的内容,第二个参数为secretKey
secretKey
例如:
w6lpcovy2#
jwt malformed是一个错误,当令牌为null或具有无效签名时会发生。在您的示例中,您具有无效签名,您应该更改这行代码:
为了验证令牌,您需要传递2个参数:
1.token(就像你做的那样)
1.secrety key。您的代码中使用密钥
'mySecretKey'
创建token,然后尝试使用密钥"secret"
进行验证,这是不正确的。您应该使用相同的密钥进行签名和验证。查看此问题以获取更多信息:Json Web Token verify() return jwt malformed
关于你的问题
How can we create common function for all other api
,最简单的方法是将代码 Package 在try/catch块中,如果验证失败,则发送错误。lnvxswe23#
根据示例中的代码,来自
logins
的响应中包含的token
使用值为'mySecretKey'
的密钥进行签名。然而,在verifyToken
函数中,您从jwt
调用verify
方法,同时传递"secret"
作为密钥,这与令牌最初签名时使用的不同。因此,您得到的错误是预期的。为了解决这个问题,在sign和verify方法中使用相同的密钥。我想这也回答了问题(2)。
对于问题(1),您可以使用授权中间件,它位于传入的HTTP请求和实际的请求处理程序之间。通常的做法是在请求头中传递JWT令牌。中间件的代码可能如下所示:
然后,在定义应用路由的文件中,可以包含以下代码,例如:
如果你想了解更多关于JWT令牌的信息,请查看这里的资源:https://jwt.io/introduction
drnojrws4#
因此,为了在任何地方使用验证而不重写它,您需要将其用作中间件,如下所示:
例如,您想调用addrecord。在服务器文件中,您将使用
app.use(verifyToken,addRecord)
。这意味着在调用addRecord函数之前,将首先调用verifyToken函数,只有当它验证令牌时,它才会继续调用addRecord函数。此外,您现在可以通过使用const decode=req.decode;
在这里查看一些示例: