我正在尝试实现这一点:https://docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/lab/part6.html
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);
}
}
我已经减少了尝试执行示例代码段,但我不知道如何克服我面临的这个问题。 据我了解,此类请求的流程应如下所示,如本文档中所详述: 1.客户端向服务器发送HTTP GET请求 2.服务器使用HTTP 401和WWW Authenticate:Negotiate标头进行响应 3.然后客户端发送另一个HTTP GET请求,这次请求中有正确的Negotiate标头。
我的问题是,当我尝试运行该示例时,请求显然因IOException而失败,因为服务器使用401响应,然后我不知道如何使用标头发出第二个请求。我试图像基本身份验证一样添加标头,但在这种情况下,我不知道从哪里获取Negotiate值。 我做了一个数据包捕获,我可以看到从KDC请求的TGS票据,所以我认为那部分是可以的,我只是不知道它应该如何应用于我的请求。我使用连接到同一Web服务的其他脚本执行相同的数据包捕获,我可以看到与上面描述的完全相同的流程。
因此,总结一下我的问题:如何将身份验证标头添加到我的请求中?我是否需要在我的代码中明确地执行此操作,如果是这样,我该怎么做?