我目前正在使用libcurl(version 7.19.6 built with SPNEGO and GSS-Negotiate support)
编写一个客户端(C ++ / C),它连接到Tomcat服务器后面的受保护网页(Kerberos
protected)。使用命令行: -
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中没有箭头(&gt;)和失败的一个中的主机行。这是否意味着永远不会发送使用者?
答案 0 :(得分:2)
好的我终于得到了它的工作,经过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错误仍然存在,并且没有得到答复。