如何获取创建新文章的用户的ID。我已经使用JWT创建了身份验证中间件。这是我的创建文章代码。
exports.createArticle = (req, res) => {
const { title, article } = req.body;
const query = {
text: 'INSERT INTO article (title, article) VALUES ($1, $2) RETURNING *',
values: [title, article],
};
pool
.query(query)
.then((response) => {
const { id, created_on } = response.rows[0];
res.status(201).json({
message: 'Article successfully posted',
articleId: id,
createdOn: created_on,
title,
});
})
.catch((error) => {
res.status(400).json({
error,
});
});
};
答案 0 :(得分:0)
您可以从JWT声明中获得该信息。以下是标准声明的列表:JWT Claims。
主题,电子邮件,姓名或昵称将是合适的,具体取决于您的情况。
如果需要内部ID(例如数据库主键),请使用主题ID链接到该内部ID。最好不要将内部引用泄漏给外部。
如何获取主题ID:
const jwt = require("jsonwebtoken");
// this is just for test, get a real verified token from your middleware
const testToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";
const token = jwt.decode(testToken);
let subjectId = token.sub; // then lookup and insert into database
您可以在此处阅读OpenID Connect规范以了解更多信息:OpenID Connect Specification第2.2节中的ID令牌部分。
答案 1 :(得分:0)
如果您要创建一个其中包含用户ID的有效载荷,然后将其传递给jwt.sign()
,则在您进行身份验证后即可获取该用户的ID。 通过验证随请求一起发送的令牌来验证用户的请求。
步骤:
注意:
这只是一个简单的步骤,可以帮助您更好地理解, 忽略语法或对错误等太过具体的内容。
用户发送登录请求。
您验证凭据并将令牌发送到客户端。
payload = { userId: userId , //rest info}
toekn = jwt.sign(payload, "key")
// send the token back, your methods may vary
用户创建文章的请求,并且您在请求,cookie,标题或您使用的任何其他机制中收到令牌
您使用中间件通过令牌对请求进行身份验证
jwt.verify(token, "key", (err, decodedUserInfo) => {
//dont proceed if err just throw error
//this decodedInfo has all the info that you have in payload while creating the token in step 2.
req.user = decodedUserInfo;
next();
}
由于您的req对象现在具有用户信息,一旦传递了中间件,就可以在后续操作中使用此信息。