#node.js #express #jwt #payload
#node.js #выразить #jwt #полезная нагрузка
Вопрос:
здравствуйте, я создаю проверку токена (JWT), и возникла эта ошибка, вот код токена подписи JWT:
if (user) {
const payload = user._id
console.log(payload)
console.log(process.env.SECRET)
const token = jwt.sign({id :payload}, process.env.SECRET, {
expiresIn: 10
})
console.log(token)
res.cookie('token', token, {
httpOnly: true
});
и проверить его (в промежуточном программном обеспечении)
const token = req.body.token ||
req.query.token ||
req.headers['x-access-token'] ||
req.cookies.token;
if (!token) {
res.status(401).send({auth: false})
}
else{
jwt.verify(token, process.env.SECRET, function (err, decoded) {
if (err){
res.status(500).send({
message: err.message
})
}
req.userId = decoded.id
next()
})
}
я не знаю проблему, я думаю, что я все сделал в соответствии с документами, но эта ошибка все еще появляется, если кто-нибудь знает решение этой проблемы, я был бы рад, если бы я это услышал спасибо!
Ответ №1:
Если jwt.verify
сбой, вы пытаетесь получить доступ к decoded.id
несуществующему свойству. Поэтому введите return
inside if(err)
, иначе код будет продолжаться, вызывая next
и пытаясь получить доступ decoded.id
, вызывая ошибку.
jwt.verify(token, process.env.SECRET, function(err, decoded) {
if (err) {
return res.status(500).send({
message: err.message
})
}
req.userId = decoded.id
next()
})
Комментарии:
1. но поскольку я создаю проверку на главной странице, как я должен определить, аутентифицирован пользователь или нет?
2. С помощью файлов cookie. Я думал, что это промежуточное программное обеспечение аутентификации, которое вы создаете. Используйте это как промежуточное программное обеспечение для каждого маршрута, который вам нужно аутентифицировать.
3. я делаю это, но это промежуточное программное обеспечение предназначено для маршрута по умолчанию, и я хочу определить, аутентифицирован пользователь или нет, чтобы (например) отобразить его фотографию профиля на главной странице, прежде чем я использовал промежуточное программное обеспечение для маршрута ‘ / profile’ и перенаправлял пользователя на главную страницу, если не было токена (или сеанса), но как я могу это сделать, когда главная страница тоже является страницей профиля, если токен существует?
4. вы можете использовать промежуточное программное обеспечение где угодно, на своей главной странице или странице своего профиля. Я не уверен, что понимаю, чего вы хотите достичь.
5. итак, если мы возьмем facebook в качестве примера facebook имеет главную страницу, где вы можете пройти аутентификацию на главной странице ‘facebook.com /’ и если вы прошли проверку подлинности Facebook code, ваша временная шкала все еще отображается по маршруту по умолчанию ‘facebook.com /’ я делаю то же самое, но главная страница содержит другой контент, если пользователь не аутентифицирован, главная страница работает как обычно, но если пользователь аутентифицирован, например, изображение профиля и другие функции добавляются на главную страницу. и когда я отправляю {auth: false}, если токен не существует, я думаю, что это плохая практика, поскольку злоумышленник может изменить его на стороне клиента, поэтому я хочу, чтобы лучшая практика определяла