Как настроить 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 );
Другие вопросы по тегам