#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. С удовольствием 👍🏻