В настоящее время я использую libcurl(version 7.19.6 built with SPNEGO and GSS-Negotiate support)
для написания клиента (C++/C), который подключается к защищенной веб-странице (Kerberos
) за сервером Tomcat. Использование командной строки: -Невозможно получить согласование аутентификации для работы в программе libcurl
curl --negotiate -u: http://prtotectedpage.jsp --verbose
это работает (сервер возвращает HTTP-401 несанкционированной, а затем оно позволяет SPNEGO
маркеров должны быть переданы и обработаны, и я получить доступ к защищенной странице).
Однако, когда я пишу следующий код и попробуйте: -
using namespace std;
#include <stdio.h>
#include <curl.h>
#define YOUR_URL "http://protectedpage.jsp"
#define ANYUSER ""
int main(int argc, char* argv[])
{
__asm int 3; //a debugging thing
//initialize a curl object
CURLcode result;
int x;
CURL* curl = curl_easy_init();
if(curl){
curl_easy_setopt(curl,CURLOPT_HTTPAUTH, CURLAUTH_GSSNEGOTIATE);
curl_easy_setopt(curl,CURLOPT_USERNAME, ANYUSER);
curl_easy_setopt(curl,CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_URL,YOUR_URL);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
return 0;
}
Я получаю ответ от сервера после первоначального подключения (ошибка 302), которая соответствует странице временно перемещен.
Кто-нибудь знает, как это может случиться.
Некоторые другие конфигурации для информации (KDC = Windows Active Directory in Windows server 2008
),
curl version(7.19.6)
и
IDE = (Microsoft visual studio)
Хорошо я сделал немного больше расследование с Wireshark и я нашел следующие различия между их начальными запросами: -
Для командной строки один (то есть успешный): -
GET /protected.jsp HTTP 1.1 \r\n
Host : somecomputername
User Agent: curl(7.19.6) (ipc-386-win32) libcurl/7.19.16 OPENSSL/0.9.8K \r\n
Accept */*\r\n
Full request: [http://somecomputername/protected.jsp]
В то время как для кода клиента (тот, который я написал и не удалось): -
GET /protected.jsp HTTP 1.1 \r\n
Host : somecomputername
Accept */*\r\n
Full request: [http://somecomputername/protected.jsp]
Это будет означать, что агент пользователя не передается в программу. Я до сих пор смотрю на него, и некоторые входы были бы оценен
Второго редактирования: - Я сделал замечание о многословной выходе как: -
Для версии командной строки (работает один) -
> GET /examples/ HTTP/1.1
> User-Agent: curl/7.19.6 (i386-pc-win32) libcurl/7.19.6 OpenSSL/0.9.8k
> Host: somecomputer
> Accept: */*
И за неработающий один (клиент код я написал): -
> GET /examples HTTP/1.1
Authorization: Basic RGt1bUByMTIzOg==
User-Agent: curl/7.19.6 (i386-pc-win32) libcurl/7.19.6 OpenSSL/0.9.8k
Host: somecomputer
Accept: */*
Оба эти первые строки вывода соответствующих файлов с расширением .exe. Теперь я заметил две вещи. Один из неудачных отправляется в Basic по умолчанию. Два (это более тревожное), никаких стрелок (>) в Useragent и строках хоста в неудавшемся. Означает ли это, что useragent никогда не отправляется?
Вы сравнивали заголовки запросов, которые посылает ваша программа с помощью 'curl'? –
Да, я предоставил их в своем редактировании (это было первым, что мне пришло в голову). –
Попробуйте отправить некоторую строку пользовательского агента в свою программу, а также скажите, не отклонять ли ('-A ''') и посмотреть, что произойдет. –