Apache HttpClient DigestAuth - 401,未经授权。但是凭据没问题
Apache HttpClient DigestAuth - 401, Unauthorized. But Credentials are okay
当我尝试使用 DIGEST 身份验证连接到网络服务器时,连接将被拒绝(401,未验证)。我能找到的与该主题相关的答案大多已弃用,因此我想开始讨论如何使用当前版本解决此问题:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4.1</version>
</dependency>
以下代码允许设置凭据并使用 Apache HttpClient 连接到我的目标 rest-service。 The credentials I am using are correct
,所以我的凭据配置或使用 HTTPClient 的方式肯定有问题。
HttpGet getArticles = new HttpGet("http://myurl.xx/api/");
Registry<AuthSchemeProvider> authSchemeRegistry =
RegistryBuilder.<AuthSchemeProvider>create().register(AuthSchemes.DIGEST,new DigestSchemeFactory()).build();
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(
new AuthScope("http://myurl.xx/api/",80),
new UsernamePasswordCredentials(username,pw));
CloseableHttpClient client = HttpClients.custom()
.setDefaultAuthSchemeRegistry(authSchemeRegistry)
.setDefaultCredentialsProvider(credentialsProvider).build();
try {
CloseableHttpResponse response = client.execute(getArticles);
logger.info(String.valueOf(response.getStatusLine().getStatusCode()));
} catch (IOException e) {
logger.error(e.getMessage(),e);
}finally {
try {
client.close();
} catch (IOException e) {
logger.error(e.getMessage(),e);
}
}
这将 return
HTTP/1.1 401 Unauthorized
我不是摘要身份验证专家,但我知道您必须连接两次,因为服务器首先会向您发送一些身份验证数据。但我相信,当我将 DIGEST 注册为 AuthentificationScheme 时,这应该会自动处理吗?
当我查看客户端时
client.authSchemeRegistry 说:
{digest=org.apache.http.impl.auth.DigestSchemeFactory@481a996b}
注册成功
这可能是也可能不是原因,但凭据的范围是错误的。 AuthScope 构造函数采用主机名,而不是 URL 作为第一个参数。
credentialsProvider.setCredentials(
new AuthScope("myurl.xx",80),
new UsernamePasswordCredentials(username,pw));
当我尝试使用 DIGEST 身份验证连接到网络服务器时,连接将被拒绝(401,未验证)。我能找到的与该主题相关的答案大多已弃用,因此我想开始讨论如何使用当前版本解决此问题:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4.1</version>
</dependency>
以下代码允许设置凭据并使用 Apache HttpClient 连接到我的目标 rest-service。 The credentials I am using are correct
,所以我的凭据配置或使用 HTTPClient 的方式肯定有问题。
HttpGet getArticles = new HttpGet("http://myurl.xx/api/");
Registry<AuthSchemeProvider> authSchemeRegistry =
RegistryBuilder.<AuthSchemeProvider>create().register(AuthSchemes.DIGEST,new DigestSchemeFactory()).build();
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(
new AuthScope("http://myurl.xx/api/",80),
new UsernamePasswordCredentials(username,pw));
CloseableHttpClient client = HttpClients.custom()
.setDefaultAuthSchemeRegistry(authSchemeRegistry)
.setDefaultCredentialsProvider(credentialsProvider).build();
try {
CloseableHttpResponse response = client.execute(getArticles);
logger.info(String.valueOf(response.getStatusLine().getStatusCode()));
} catch (IOException e) {
logger.error(e.getMessage(),e);
}finally {
try {
client.close();
} catch (IOException e) {
logger.error(e.getMessage(),e);
}
}
这将 return
HTTP/1.1 401 Unauthorized
我不是摘要身份验证专家,但我知道您必须连接两次,因为服务器首先会向您发送一些身份验证数据。但我相信,当我将 DIGEST 注册为 AuthentificationScheme 时,这应该会自动处理吗?
当我查看客户端时 client.authSchemeRegistry 说:
{digest=org.apache.http.impl.auth.DigestSchemeFactory@481a996b}
注册成功
这可能是也可能不是原因,但凭据的范围是错误的。 AuthScope 构造函数采用主机名,而不是 URL 作为第一个参数。
credentialsProvider.setCredentials(
new AuthScope("myurl.xx",80),
new UsernamePasswordCredentials(username,pw));