JWT-TypeError: не удается прочитать свойство ‘id’ неопределенного типа

#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}, если токен не существует, я думаю, что это плохая практика, поскольку злоумышленник может изменить его на стороне клиента, поэтому я хочу, чтобы лучшая практика определяла