Как решить проблему отказа в доступе: неверный токен, неправильный код?

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

person Bug    schedule 13.06.2020    source источник


Ответы (1)


Попробуйте этот код с библиотекой hotp-totp-generator

const axios = require('axios');
const base64 = require('base-64');
const utf8 = require('utf8');
const hotpTotpGenerator = require('hotp-totp-generator');

const ReqJSON = {
  github_url: 'GITHUB_REPO',
  contact_email: 'YOUR_MAIL',
};

const stringData = JSON.stringify(ReqJSON);
const URL = 'CHALLENGE_URL';
const sharedSecret = ReqJSON.contact_email + 'SPECIAL_CODE';

const MyTOTP = hotpTotpGenerator.totp({
  key: sharedSecret,
  T0: 0,
  X: 30,
  algorithm: 'sha512',
  digits: 10,
});

const authStringUTF = ReqJSON.contact_email + ':' + MyTOTP;
const bytes = utf8.encode(authStringUTF);
const encoded = base64.encode(bytes);

const createReq = async () => {
  try {
    const config = {
      withCredentials: true,
      headers: {
        'Content-Type': 'application/json',
         Authorization: 'Basic ' + encoded,
      },
    };

    console.log('Making request', { URL, ReqJSON, config });

    const response = await axios.post(URL, stringData, config);
    console.log(response.data);
  } catch (err) {
    console.error(err.response.data);
  }
};

createReq();
person Tigran Arshakyan    schedule 20.10.2020