Как реализовать OAuth 2 на C/C++ с помощью curl
Я пытаюсь реализовать протокол 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-запросы и снова проверяет и отправляет и т. Д.
Сводка кода C++:
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 различаются:
Вывод задачи кода Python: 9iokv3y_-_5ihVaQ8u7U0BRuitfva5ZIialcIwokh18
C++: YmJlZmU1NGE1MDQ0MWYzZGE2YWIxMmQxYzU3ZGY0Y2MwNTk2NTVjODczYWY4NGQwZTJhNTc1M2E1MDNjMDZjMw
Кроме того, похоже, существует проблема с длиной переменной hashedCodeChallenge
так как он изменит свое значение после функции generateCodeChallenge
закончил.
Полный проект для просмотра кода: Github