Невозможно получить согласование аутентификации для работы в программе libcurl

Я сейчас пользуюсь libcurl(version 7.19.6 built with SPNEGO and GSS-Negotiate support) написать клиента (C ++ / C), который подключается к защищенной веб-странице (Kerberos защищен) за сервером Tomcat. Используя командную строку: —

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 никогда не отправляется?

3

Решение

Хорошо, я, наконец, заставил его работать, после нескольких указаний по n.m и некоторых проблем тут и там, я наконец получил рабочий код: —

using namespace std;

#include "stdafx.h"#include <stdio.h>
#include <curl.h>

#define YOUR_URL "http://invr28ppqa24:8080/examples"#define ANYUSER ""#define ANYPWD ""
int main(int argc, char* argv[])
{
//__asm int 3;

//initialize a curl object
CURLcode result;
int x;
CURL* curl = curl_easy_init();                  //initialize a easy curl handle
if(curl){
curl_easy_setopt(curl,CURLOPT_USERNAME, ANYUSER);                       //set second option to enable anyuser, a trick necessary for program to work
curl_easy_setopt(curl,CURLOPT_USERNAME, ANYPWD);
curl_easy_setopt(curl,CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_URL,YOUR_URL);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, "false");
curl_easy_setopt(curl, CURLOPT_USERAGENT, "curl/7.19.6 (i386-pc-win32) libcurl/7.19.6 OpenSSL/0.9.8k");
curl_easy_setopt(curl,CURLOPT_HTTPAUTH, CURLAUTH_GSSNEGOTIATE);         //set first option to enable gssnegotiate authentication
curl_easy_perform(curl);
//curl_easy_cleanup(curl);
scanf("%d", &x);                            //last statement used to get delay in demo situations
}
return 0;

}

302 по-прежнему приходит, и я должен вручную установить useragent (не так элегантно). Из-за местоположения следования проблема была решена в первую очередь. Благодарю.

Начальная ошибка 302 все еще там и осталась без ответа.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]