【发布时间】:2022-02-13 02:43:06
【问题描述】:
我的功能只是将数据发送到数据库(我的帖子)。我使用私钥和公钥来签名和验证令牌。我可以在标头中将这个令牌从前端发送到后端,但是在验证它时有问题。下面是这个流程的样子:
前端
router.post(`/p-p`, async (req, res) => {
try {
const data = await api.post(`/post-post`, req.body, {
headers: {
Authorization: 'Bearer ' + req.body.token
}
})
res.json(data.data)
} catch (e) {
res.status(e.response.status).json(e.response.data)
}
})
后端
router.post(
"/post-post",
auth,
wrapAsync(generalController.postPost)
)
中间件认证
const jwtService = require('./../services/jwtService')
module.exports = async(req, res, next) => {
if (req.headers.authorization) {
const user = await jwtService.getUser(req.headers.authorization.split(' ')[1])
if (user) {
next();
} else {
res.status(401).json({
error: 'Unauthorized'
})
}
} else {
res.status(401).json({
error: 'Unauthorized'
})
}
}
和 JWT 服务
const jwt = require('jsonwebtoken');
const fs = require("fs");
const path = require("path");
const pathToKeys = path.resolve(__dirname, "../../keys");
module.exports = {
sign(payload) {
const cert = fs.readFileSync(`${pathToKeys}/private.pem`);
return jwt.sign(
payload,
{
key: cert,
passphrase: process.env.JWT_PASSPHRASE
},
{
algorithm: "RS256",
expiresIn: "30m"
}
)
},
getUserPromise(token) {
return new Promise((resolve, reject) => {
jwt.verify(token, fs.readFileSync(`${pathToKeys}/public.pem`), (err, decoded) => {
if(!err) {
return resolve(decoded);
} else {
return reject(err);
}
})
})
},
async getUser (token) {
return await this.getUserPromise(token)
}
}
问题在getUserPromise 函数之后开始。此函数可以获取令牌,但无法验证它,我遇到了这个问题:
UnhandledPromiseRejectionWarning: JsonWebTokenError: jwt malformed
实际上,我不知道问题出在哪里。我生成了密钥对,sign 函数可以唱歌并返回令牌,看起来像这样:351e38a4bbc517b1c81e180479a221d404c724107988852c7768d813dd0510e6183306b1d837091b2cddaa07f2427b7a
那么,有什么问题呢?
【问题讨论】:
-
您确定您使用的是有效令牌吗?我只将 JWT 视为三个点分隔的 Base64 字符串,并且您似乎传递了一个十六进制值(并且是一个短值)。参见例如the jwt.io getting started page 用于通常格式
-
这能回答你的问题吗? Json Web Token verify() return jwt malformed
-
我不知道你在哪里以及如何调用 sign 函数,但在其中你调用 jwt.sign 并返回它作为结果,不知道如何从中获取十六进制字符串.十六进制字符串显然不是 JWT,不知道你是如何或从哪里得到它的。
标签: javascript node.js express jwt