Как реализовать OAuth 2 в C / C ++ с помощью curl - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь реализовать протокол OAuth 2 PKCE для моего собственного настольного приложения, написанного на C ++, для извлечения данных из интерфейса swagger (EVE-Online) . Вот пример Python, который показывает, как работает аутентификация для собственного приложения: Пример Python

Так что в основном я пытаюсь преобразовать код из Python в C ++.

Сводка кода Python:

import base64
import hashlib
import secrets

#Generate code challenge
random = base64.urlsafe_b64encode(secrets.token_bytes(32))
m = hashlib.sha256()
m.update(random)
d = m.digest()
code_challenge = base64.urlsafe_b64encode(d).decode().replace("=", "")

...

code_verifier = base64.urlsafe_b64encode(random).decode().replace("=", "")

После этого он просто отправляет HTTP-запросы, проверяет и отправляет снова и т. Д.

С ++ Сводка кода:

void SSOAuthentication::generateCodeChallenge()
{
    // Generate PKCE_BYTE_NUM of random bytes
    std::random_device randomDevice;
    unsigned char randomBuffer[PKCE_BYTE_NUM];
    for (unsigned char& i : randomBuffer) {
        i = randomDevice();
    }

    // Encode the raw random bytes to base64-url-safe
    std::string randomEncodedTmp = Base64::base64EncodeUrlSafe(randomBuffer, PKCE_BYTE_NUM);

    // Save the encoded random bytes
    random = (unsigned char*) randomEncodedTmp.c_str();

    // Hash the given code challenge with sha256
    std::string hashedTmp = sha256(randomEncodedTmp);
    auto unsignedHashedTmp = (unsigned char*) hashedTmp.c_str();

    // Encode hashed code challenge
    std::string encodedHashedTmp = Base64::base64EncodeUrlSafe(unsignedHashedTmp, hashedTmp.length());

    // Replace all occurrences of '=' with ''
    encodedHashedTmp.erase(std::remove(encodedHashedTmp .begin(), encodedHashedTmp .end(), '='), encodedHashedTmp .end());

    // Save the hashed code challenge
    hashedCodeChallenge = (unsigned char*) encodedHashedTmp.c_str();

    // Encode random again
    std::string encodedRandomTmp = Base64::base64EncodeUrlSafe(random, randomEncodedTmp.length());

    // Replace all occurrences of '=' with ''
    encodedRandomTmp.erase(std::remove(encodedRandomTmp.begin(), encodedRandomTmp.end(), '='), encodedRandomTmp.end());

    // Save the code verifier
    codeVerifier = (unsigned char*) encodedRandomTmp.c_str();
}

Для кодирования Base64 я использовал ответ LihO: Ответ LihO для кодировки Base64

Для Sha256 я использовал это руководство: Sha256

вопрос: длина code_challenge и характеристика отличается:

1034 * Python код вызова вывода: 9iokv3y _-_ 5ihVaQ8u7U0BRuitfva5ZIialcIwokh18 1036 * C ++: YmJlZmU1NGE1MDQ0MWYzZGE2YWIxMmQxYzU3ZGY0Y2MwNTk2NTVjODczYWY4NGQwZTJhNTc1M2E1MDNjMDZjMw 1038 * Дополнительно, кажется, существует проблема длины с переменной hashedCodeChallenge, так как она изменит свое значение после завершения функции generateCodeChallenge.

Full Project для просмотра кода: Github

...