1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.hc.client5.http.impl;
29
30 import java.util.ArrayList;
31 import java.util.Arrays;
32 import java.util.Collection;
33 import java.util.Collections;
34 import java.util.List;
35 import java.util.Locale;
36 import java.util.Map;
37
38 import org.apache.hc.client5.http.AuthenticationStrategy;
39 import org.apache.hc.client5.http.auth.AuthChallenge;
40 import org.apache.hc.client5.http.auth.AuthScheme;
41 import org.apache.hc.client5.http.auth.AuthSchemeFactory;
42 import org.apache.hc.client5.http.auth.StandardAuthScheme;
43 import org.apache.hc.client5.http.auth.ChallengeType;
44 import org.apache.hc.client5.http.config.RequestConfig;
45 import org.apache.hc.client5.http.protocol.HttpClientContext;
46 import org.apache.hc.core5.annotation.Contract;
47 import org.apache.hc.core5.annotation.ThreadingBehavior;
48 import org.apache.hc.core5.http.config.Lookup;
49 import org.apache.hc.core5.http.protocol.HttpContext;
50 import org.apache.hc.core5.util.Args;
51 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
53
54
55
56
57
58
59 @Contract(threading = ThreadingBehavior.STATELESS)
60 public class DefaultAuthenticationStrategy implements AuthenticationStrategy {
61
62 private static final Logger LOG = LoggerFactory.getLogger(DefaultAuthenticationStrategy.class);
63
64 public static final DefaultAuthenticationStrategycationStrategy.html#DefaultAuthenticationStrategy">DefaultAuthenticationStrategy INSTANCE = new DefaultAuthenticationStrategy();
65
66 private static final List<String> DEFAULT_SCHEME_PRIORITY =
67 Collections.unmodifiableList(Arrays.asList(
68 StandardAuthScheme.SPNEGO,
69 StandardAuthScheme.KERBEROS,
70 StandardAuthScheme.NTLM,
71 StandardAuthScheme.DIGEST,
72 StandardAuthScheme.BASIC));
73
74 @Override
75 public List<AuthScheme> select(
76 final ChallengeType challengeType,
77 final Map<String, AuthChallenge> challenges,
78 final HttpContext context) {
79 Args.notNull(challengeType, "ChallengeType");
80 Args.notNull(challenges, "Map of auth challenges");
81 Args.notNull(context, "HTTP context");
82 final HttpClientContext clientContext = HttpClientContext.adapt(context);
83 final String exchangeId = clientContext.getExchangeId();
84
85 final List<AuthScheme> options = new ArrayList<>();
86 final Lookup<AuthSchemeFactory> registry = clientContext.getAuthSchemeRegistry();
87 if (registry == null) {
88 if (LOG.isDebugEnabled()) {
89 LOG.debug("{} Auth scheme registry not set in the context", exchangeId);
90 }
91 return options;
92 }
93 final RequestConfig config = clientContext.getRequestConfig();
94 Collection<String> authPrefs = challengeType == ChallengeType.TARGET ?
95 config.getTargetPreferredAuthSchemes() : config.getProxyPreferredAuthSchemes();
96 if (authPrefs == null) {
97 authPrefs = DEFAULT_SCHEME_PRIORITY;
98 }
99 if (LOG.isDebugEnabled()) {
100 if (LOG.isDebugEnabled()) {
101 LOG.debug("{} Authentication schemes in the order of preference: {}", exchangeId, authPrefs);
102 }
103 }
104
105 for (final String schemeName: authPrefs) {
106 final AuthChallenge challenge = challenges.get(schemeName.toLowerCase(Locale.ROOT));
107 if (challenge != null) {
108 final AuthSchemeFactory authSchemeFactory = registry.lookup(schemeName);
109 if (authSchemeFactory == null) {
110 if (LOG.isWarnEnabled()) {
111 LOG.warn("{} Authentication scheme {} not supported", exchangeId, schemeName);
112
113 }
114 continue;
115 }
116 final AuthScheme authScheme = authSchemeFactory.create(context);
117 options.add(authScheme);
118 } else {
119 if (LOG.isDebugEnabled()) {
120 LOG.debug("{}, Challenge for {} authentication scheme not available", exchangeId, schemeName);
121 }
122 }
123 }
124 return options;
125 }
126
127 }