Как мне установить роль в аутентификации узла JS JWT?

#javascript #node.js #rest

#javascript #node.js #rest

Вопрос:

Я действительно новичок в Node JS, и теперь я узнаю о том, как использовать аутентификацию JWT в моем Rest API, я уже создаю генератор токенов в своей функции входа в систему, но когда я пытаюсь проверить токен, установив некоторую роль, где, если роль равна 2, я мог бы получить данные. И теперь у меня проблемы, потому что я не могу проверить свой токен

Вход:

 exports.login = function(req, res){
    var post = {
        email : req.body.email,
        password : req.body.password
    }

    var query = "SELECT * FROM ?? WHERE ?? = ? AND ?? = ?";
    var table = ["user", "password", md5(post.password), "email",post.email];

    query = mysql.format(query,table);

    connection.query(query, function(error, rows){
        if(error){
            console.log(error);
        }else{
            if (rows.length == 1){
                //ini 1440 dalam second
                var token = jwt.sign({rows}, config.secret);
                id_user = rows[0].id;
                username = rows[0].username;
                email = rows[0].email;
                tanggal_daftar = rows[0].tanggal_daftar;
                role = rows[0].role;

                var data = {
                    id_user : id_user,
                    access_token : token,
                    username : username,
                    email : email,
                    tanggal_daftar : tanggal_daftar,
                    role : role,
                    ip_address : ip.address()
                }

                res.json({
                     success : true,
                     message : "Token JWT generate",
                     token : token,
                     idUser: data.id_user,
                     username : username,
                     email : data.email,
                     tanggal_daftar : tanggal_daftar,
                     role : data.role
                    });

            }else{
                 res.json({"Error": true, "Message":"Email atau password anda salah"});
            }
        }
    });
}
  

Проверка токена:

 const jwt = require('jsonwebtoken');
const config = require('../config/secret');

function verifikasi(role){
    return function (req, rest, next){
    // var role = req.body.role;
        //cek authorization header
        var tokenWithBearer = req.headers.authorization;
        if(tokenWithBearer){
            var token = tokenWithBearer.split(' ')[1];
            //verifikasi
            jwt.verify(token, config.secret, function(err, decoded){
                if(err){
                    return rest.status(401).send({auth:false, message:"Token tidak terdaftar!"});
                }else{
                    if(role == 2){
                        req.auth = decoded;
                        next();
                    }else{
                        return rest.status(401).send({auth:false, message:"gagal melakukan otorisasi!"});
                    }
                }
            });
        }else{
            return rest.status(401).send({auth:false, message:"Token tidak tersedia!"});
        }
    }
}

module.exports = verifikasi;
  

Указатель:

 // alamat dengan otoritas khusus
router.get('/api/v1/rahasia', verifikasi(), auth.halamanrahasia);
  

Комментарии:

1. Какую ошибку вы получаете? Также вы не передаете значение role своей функции verifikasi.

2. Ошибка в том, что я не могу подтвердить свою учетную запись, используя роль в postman, плюс я пытался ввести значение в свою функцию, но из-за этого другая учетная запись с другой ролью могла получить данные

3. Какой ответ вы получаете в postman после отправки запроса?

4. он продолжает выдавать код 401, и сообщение не удалось авторизовать

5. выполните console.log(декодированный) внутри jwt.verify и посмотрите, каково его значение.

Ответ №1:

В вашем есть ошибка if(role == 2) , которую вы должны изменить на (decoded.role == 2)

Редактировать: изменить if(role == 2) на if(decoded.rows.role == 2)

Комментарии:

1. при попытке доступа к маршруту /api/v1/rahasia регистрируются ли какие-либо ошибки в терминале, на котором работает ваш сервер? Или поток кода работает не так, как вы хотите. И каков ответ сервера при возникновении ошибки?

2. код работает не так, как я хочу, и он продолжает выдавать код 401 плюс сообщение не удалось авторизоваться

3. Код ошибки 401, потому что у вас есть 3 оператора return, которые возвращают статус 401. Проверьте, какой оператор возврата вы получили. Token tidak tersedia! или gagal melakukan otorisasi! или Token tidak terdaftar! я думаю, что вы правильно поняли это? gagal melakukan otorisasi! Я думаю, что нашел ошибку. Вам нужно изменить if(role == 2) на if(decoded.rows.role == 2) . Потому что, когда вы создали токен, вы передаете var token = jwt.sign({rows}, config.secret); вместо var token = jwt.sign(rows, config.secret); . Он обернул ваш объект rows внутри другого объекта, поэтому вам нужно использовать decoded.rows.role

4. Приветствую вас. Можете ли вы отметить меня как правильный ответ: D Я добавил отредактированную часть для правильного ответа: D

5. С удовольствием 👍🏻