Java中web请求的Kerberos身份验证?
我正试图实现这一点: 我已经减少到只执行示例代码段,但我不知道如何克服我面临的这个问题。 据我所知,此类请求的流程应如本文件所述: 1.客户端向服务器发送HTTP GET请求 2.服务器用一个HTTP401和一个WWW认证:协商头进行响应 3.然后,客户端发送另一个HTTP GET请求,这次请求中包含正确的协商头 我的问题是,当我尝试运行该示例时,请求显然会失败,并出现IOException,因为服务器使用401进行响应,然后我不知道如何使用头发出第二个请求。我试图像基本身份验证一样添加一个头,但在这种情况下,我不知道从哪里获取该头的协商值。 我做了一个包捕获,我可以看到从KDC请求TGS票证,所以我认为这部分是可以的,我只是不知道它应该如何应用于我的请求。我对连接到同一web服务的其他脚本执行了相同的数据包捕获,我可以看到与上面描述的完全相同的流 因此,总结一下我的问题:我应该如何将身份验证头添加到请求中?我是否需要在我的代码中明确地这样做,如果需要,我该如何做Java中web请求的Kerberos身份验证?,java,authentication,kerberos,Java,Authentication,Kerberos,我正试图实现这一点: 我已经减少到只执行示例代码段,但我不知道如何克服我面临的这个问题。 据我所知,此类请求的流程应如本文件所述: 1.客户端向服务器发送HTTP GET请求 2.服务器用一个HTTP401和一个WWW认证:协商头进行响应 3.然后,客户端发送另一个HTTP GET请求,这次请求中包含正确的协商头 我的问题是,当我尝试运行该示例时,请求显然会失败,并出现IOException,因为服务器使用401进行响应,然后我不知道如何使用头发出第二个请求。我试图像基本身份验证一样添加一个头,
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.net.URL;
public class RunHttpSpnego {
static final String kuser = "username"; // your account name
static final String kpass = "password"; // your password for the account
static class MyAuthenticator extends Authenticator {
public PasswordAuthentication getPasswordAuthentication() {
// I haven't checked getRequestingScheme() here, since for NTLM
// and Negotiate, the usrname and password are all the same.
System.err.println("Feeding username and password for "
+ getRequestingScheme());
return (new PasswordAuthentication(kuser, kpass.toCharArray()));
}
}
public static void main(String[] args) throws Exception {
Authenticator.setDefault(new MyAuthenticator());
URL url = new URL(args[0]);
InputStream ins = url.openConnection().getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
String str;
while((str = reader.readLine()) != null)
System.out.println(str);
}
}