#javascript #node.js #express #jwt
#javascript #node.js #выразить #jwt
Вопрос:
Я изучаю node и переношу свой текущий API с python. Я пытаюсь создать токен jwt для аутентификации в стороннем API, однако моя функция возвращает undefined
. Метод jwt, который я использую для подписи токена, таков async
, поэтому я предполагаю, что моя функция не ждет, пока jwt вернет токен.
Это моя функция для подписи и создания токена jwt:
function token() {
const payload = {
iat: Math.floor(new Date() / 1000),
exp: Math.floor(new Date() / 1000) 30,
sub: "api_key_jwt",
iss: "external",
jti: crypto.randomBytes(6).toString("hex")
};
return jwt.sign(payload, privatekey, { algorithm: "RS256" }, function(
err,
token2
) {
return token2;
});
}
Итак, когда я вызываю его:
exports.genToken = function() {
const header = {
"x-api-key": api
};
const data = {
kid: api,
jwt_token: token()
};
async function authorization(req, res) {
try {
const auth = await rp({
url: authurl,
method: "POST",
headers: header,
body: data
});
res.send(auth.body);
} catch (error) {
res.send(404).send();
}
}
return {
"x-api-key": api,
Authorization: "Bearer " authorization()
};
};
jwt_token
ВОЗВРАТ undefined
. Что я делаю не так, и как я могу это исправить?
Заранее спасибо, ребята!
Редактировать: console.log(token2)
возвращает подписанный токен. Итак, проблема заключается в возврате токена из token()
функции
Комментарии:
1. Можете ли вы утешить. зарегистрируйте переменную err в функции обратного вызова и опубликуйте ее результаты? Содержит ли он ошибку?
2. Привет, Джордж, я отредактировал вопрос. На самом деле токен подписывается
jwt.sign
, однако он не возвращается кtoken()
функции
Ответ №1:
Вы пытаетесь вернуться из a callback
, который не работает. Измените свою функцию токена на return Promise
, тогда вы можете использовать async/await
подобное:
function token() {
...
return new Promise((resolve, reject) => {
jwt.sign(payload, privatekey, { algorithm: "RS256" }, function(err, token2) {
if (err) reject(err);
else resolve(token2)
});
})
}
// note async
exports.genToken = async function() {
...
const data = {
kid: api,
jwt_token: await token()
};
...
}
Комментарии:
1. Дополнение к этому правильному ответу: в javascript существуют разные реализации асинхронных задач. В вашем случае библиотека jwt не возвращает обещание, поэтому вам нужно создать свое собственное обещание, чтобы использовать его в вашем подходе async / await. P.S: Вы также можете использовать функцию обратного вызова в своем токене и добиться того же.
2. Отлично! Это было так. Я все еще немного путаюсь
async/await
. Большое спасибо!3. Stackoverflow заставляет меня ждать 15 минут, прежде чем я смогу принять ответ 🙂