В недавнем школьном проекте, который мне поручили, есть задача по кодированию, которую мы должны выполнить. Задача состоит из нескольких частей, и последняя часть - это загрузка в частное репозиторий GitHub и отправка запроса на завершение путем выполнения запроса POST при определенных условиях.
Я успешно выполнил остальные части задания и застрял на отправке запроса. Подача должна соответствовать следующим правилам:
Создайте запрос на решение
Сначала создайте строку JSON, как показано ниже:
{
"github_url": "https://github.com/YOUR_ACCOUNT/GITHUB_REPOSITORY",
"contact_email": "YOUR_EMAIL"
}
Введите свой адрес электронной почты для YOUR_EMAIL и частный репозиторий Github с вашим решением в YOUR_ACCOUNT / GITHUB_REPOSITORY. Затем отправьте HTTP-запрос POST на следующий URL-адрес со строкой JSON в качестве части тела.
CHALLENGE_URL
Тип содержимого
Content-Type: запроса должен быть application / json.
Авторизация
URL-адрес защищен базовой аутентификацией HTTP, которая объясняется в главе 2 RFC2617, поэтому вы должны предоставить поле заголовка Authorization: в своем запросе POST.
В качестве идентификатора пользователя базовой аутентификации HTTP используйте тот же адрес электронной почты, который вы указали в строке JSON. В качестве пароля укажите 10-значный одноразовый пароль, основанный на времени, соответствующий RFC6238 TOTP. Пароль авторизации
Для генерации пароля TOTP вам понадобится следующая настройка:
Вы должны сгенерировать правильный пароль TOTP в соответствии с RFC6238. Временной шаг TOTP X составляет 30 секунд. T0 равен 0. Используйте HMAC-SHA-512 для хэш-функции вместо HMAC-SHA-1 по умолчанию. Общий секрет токена - это ИД пользователя, за которым следует строковое значение ASCII «APICHALLENGE» (не включая двойные кавычки). Общие секретные примеры
Например, если идентификатор пользователя - «[email protected]», общий секрет токена будет «[email protected]» (без кавычек).
Если ваш запрос POST завершится успешно, сервер вернет код состояния HTTP 200.
Я старался очень внимательно следовать этому плану и тестировать свою работу разными способами. Однако, похоже, я не могу это понять. Мы должны сделать запрос от бэкэнда сервера Node. Это то, что я делал до сих пор. Я создал новый проект npm с помощью npm init и установил зависимости, которые вы увидите в приведенном ниже коде:
const base64 = require('base-64');
const utf8 = require('utf8');
const { totp } = require('otplib');
const reqJSON =
{
github_url: GITHUB_URL,
contact_email: MY_EMAIL
}
const stringData = JSON.stringify(reqJSON);
const URL = CHALLENGE_URL;
const sharedSecret = reqJSON.contact_email + "APICHALLENGE";
totp.options = { digits: 10, algorithm: "sha512" , epoch: 0}
const myTotp = totp.generate(sharedSecret);
const isValid = totp.check(myTotp, sharedSecret);
console.log("Token Info:", {myTotp, isValid});
const authStringUTF = reqJSON.contact_email + ":" + myTotp;
const bytes = utf8.encode(authStringUTF);
const encoded = base64.encode(bytes);
const createReq = async () =>
{
try
{
// set the headers
const config = {
headers: {
'Content-Type': 'application/json',
"Authorization": "Basic " + encoded
}
};
console.log("Making req", {URL, reqJSON, config});
const res = await axios.post(URL, stringData, config);
console.log(res.data);
}
catch (err)
{
console.error(err.response.data);
}
};
createReq();```
As far as I understand, I'm not sure where I'm making a mistake. I have tried to be very careful in my understanding of the requirements. I have briefly looked into all of the documents the challenge outlines, and gathered the necessary requirements needed to correctly generate a TOTP under the given conditions.
I have found the npm package otplib can satisfy these requirements with the options I have passed in.
However, my solution is incorrect. When I try to submit my solution, I get the error message, "Invalid token, wrong code". Can someone please help me see what I'm doing wrong?
I really don't want all my hard work to be for nothing, as this was a lengthy project.
Thank you so much in advance for your time and help on this. I am very grateful.