Как настроить WinInet на использование токена на предъявителя
Я использую OAuth2 с сервером и wininet в качестве http-клиента. Я не вижу, как настроить wininet для использования токена на предъявителя (просто посмотрите, как установить имя пользователя и пароль для базовой аутентификации). Можно ли сказать wininet использовать токен на предъявителя? (что-то вроде INTERNET_OPTION_USERNAME...)
2 ответа
Это тот же код, чтобы получить токен доступа от Google. Заметка InternetOpenA
использования NULL
для имени пользователя и пароля. В случае успеха он читает файл JSON в str
который будет содержать токен доступа, этот токен доступа используется с последующими запросами GET/POST.
std::string client_secret = "123";
std::string client_id = "1234";
std::string authorization_token = "token from browser";
std::string query, header;
{
stringstream ss;
ss << "code=" << authorization_token
<< "&client_id=" << client_id << ".apps.googleusercontent.com"
<< "&client_secret=" << client_secret
<< "&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code";
query = ss.str();
}
{
stringstream ss;
ss << "Content-Type: application/x-www-form-urlencoded\r\nContent-length: "
<< query.size() << "\r\nConnection: Close\r\n\r\n";
header = ss.str();
}
HINTERNET hopen = InternetOpenA("appname", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hconnect = InternetConnectA(hopen,
"accounts.google.com", INTERNET_DEFAULT_HTTPS_PORT,
NULL, //username
NULL, //password
INTERNET_SERVICE_HTTP, 0, 1);
HINTERNET hrequest = HttpOpenRequestA(hconnect, "POST", "o/oauth2/token",
NULL, "http://localhost",
NULL, INTERNET_FLAG_SECURE | INTERNET_FLAG_DONT_CACHE, 0);
if(hrequest)
{
BOOL res = HttpSendRequestA(hrequest, header.c_str(), header.size(),
&query[0], query.size());
std::string data;
if(res)
{
DWORD received;
const int bufsize = 4096;
std::vector<BYTE> buf(bufsize);
while(InternetReadFile(hrequest, &buf[0], bufsize, &received) && received)
data.insert(data.end(), buf.begin(), buf.begin() + received);
std::string str(data.begin(), data.end());
//=> access token
}
InternetCloseHandle(hrequest);
}
InternetCloseHandle(hconnect);
InternetCloseHandle(hopen);
Передайте «Авторизация: носитель» + токен в HttpAddRequestHeaders(). В моем случае мне пришлось получить доступ к IdentityServer API из клиента win32 C++ MFC (WinInet). Убедитесь, что InternetConnect() задан с доменом сервера, а не с IP-адресом, и что токен имеет правильные области действия.
HINTERNET hSession, hConnect, hRequest;
hSession = InternetOpen( NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0 );
if( hSession )
{
CString strServerDomain = GetServerDomainName();
hConnect = InternetConnect( hSession, strServerDomain, INTERNET_DEFAULT_HTTPS_PORT,
NULL, NULL,INTERNET_SERVICE_HTTP, 0, 0 );
if( hConnect )
{
hRequest = HttpOpenRequest( hConnect, "GET", strParams, NULL, NULL, 0,
INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_SECURE, 0 ); // strParams = "projectName/controller/Action/"
if( hRequest )
{
CString strToken = "Your Token Goes Here"; // Token
CString strHeader = "";
strHeader.Format( "Authorization: Bearer %s", strToken );
BOOL bHeaderAdded = HttpAddRequestHeaders( hRequest, strHeader, strHeader.GetLength(), 0 );
ASSERT( bHeaderAdded );
BOOL hHttpRequest = HttpSendRequest( hRequest, NULL, 0, NULL, 0 );