Hey Guys,

I was wondering if anyone has successfully been able to connect to SOLR
4.3.1 using DIGEST authentication with HttpSolrServer ?

*How I generated the password*
./digest.sh -a md5 admin:secure:password
admin:secure:password:e430caca84c337d4b820c44c1ebc943a

*I can successfully log in via browser:*
*[image: Inline image 1]
*
*
*
*Tomcat Logs after :*
FINE: Attempting to authenticate user "admin" with realm
"org.apache.catalina.realm.MemoryRealm/1.0"
Jul 24, 2013 7:32:49 PM org.apache.catalina.realm.RealmBase authenticate
FINE: Digest : d085a7ed1747cc5e44748e402f8bfea3 Username:admin
ClientSigest:d085a7ed1747cc5e44748e402f8bfea3
nonce:1374658345333:90ec031d23e72defdeef154de6819b12 nc:0000004f
cnonce:52545941c1d2299c qop:auth
realm:securemd5a2:ea8719b47592cd3b04329611320a94d9 Server
digest:d085a7ed1747cc5e44748e402f8bfea3
Jul 24, 2013 7:32:49 PM org.apache.catalina.realm.CombinedRealm authenticate
FINE: Authenticated user "admin" with realm
"org.apache.catalina.realm.MemoryRealm/1.0"
Jul 24, 2013 7:32:49 PM org.apache.catalina.realm.RealmBase
hasResourcePermission
FINE:   Checking roles GenericPrincipal[admin(admin,manager-script,)]
Jul 24, 2013 7:32:49 PM org.apache.catalina.realm.RealmBase hasRole
FINE: Username admin has role admin
Jul 24, 2013 7:32:49 PM org.apache.catalina.realm.RealmBase
hasResourcePermission
FINE: Role found:  admin

I can also successfully log in connecting using HttpClient directly doing a
HttpGet

HttpResponse response = *null*;
HttpHost targetHost = *new* HttpHost("localhost", 8080, "http");
DefaultHttpClient httpClient = *new* DefaultHttpClient();
AuthScope authScope = *new*
 AuthScope(targetHost.getHostName(), targetHost.getPort(), "secure");
UsernamePasswordCredentials credentials = *new* UsernamePasswordCredentials(
"admin", "password");
httpClient.getCredentialsProvider().setCredentials(authScope, credentials);
HttpGet httpget = *new* HttpGet("http://localhost:8080";);
response = httpClient.execute(targetHost, httpget);
System.out.println(response); //Which prints HTTP/1.1 200 OK [Server:
Apache-Coyote/1.1, Cache-Control: private, Expires: Thu, 01 Jan 1970
10:00:00 EST, Content-Type: text/html;charset=UTF-8, Transfer-Encoding:
chunked, Date: Wed, 24 Jul 2013 10:02:37 GMT]


Logs for the above connection:
FINE: Attempting to authenticate user "admin" with realm
"org.apache.catalina.realm.MemoryRealm/1.0"
Jul 24, 2013 7:35:52 PM org.apache.catalina.realm.RealmBase authenticate
FINE: Digest : 85e101cdfbb5585696b557fe55601077 Username:admin
ClientSigest:85e101cdfbb5585696b557fe55601077
nonce:1374658552710:00f1e255052b59840a73f6919d9ada78 nc:00000001
cnonce:37d15b4cfe5167b4 qop:auth
realm:securemd5a2:71998c64aea37ae77020c49c00f73fa8 Server
digest:85e101cdfbb5585696b557fe55601077
Jul 24, 2013 7:35:52 PM org.apache.catalina.realm.CombinedRealm authenticate
FINE: Authenticated user "admin" with realm
"org.apache.catalina.realm.MemoryRealm/1.0"
Jul 24, 2013 7:35:52 PM org.apache.catalina.realm.RealmBase
hasResourcePermission
FINE:   Checking roles GenericPrincipal[admin(admin,manager-script,)]
Jul 24, 2013 7:35:52 PM org.apache.catalina.realm.RealmBase hasRole
FINE: Username admin has role admin
Jul 24, 2013 7:35:52 PM org.apache.catalina.realm.RealmBase
hasResourcePermission
FINE: Role found:  admin

*It's just that when I request using HttpSolrServer I get unauthorized error
*
org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException:
Server at 
http://localhost:8080/p<http://localhost:8080/cmrsearchengine/primary>rimary
returned non ok status:401, message:Unauthorized
*
*
Here is how I'm connecting to SOLR using HttpSolrServer

HttpResponse response = *null*;
HttpHost targetHost = *new* HttpHost("localhost", 8080, "http");
DefaultHttpClient httpClient = *new* DefaultHttpClient();
httpClient.addRequestInterceptor(*new* PreemptiveAuthInterceptor(), 0);
AuthScope authScope = *new*
 AuthScope(targetHost.getHostName(), targetHost.getPort(), "secure");
UsernamePasswordCredentials credentials = *new* UsernamePasswordCredentials(
"admin", "password");
httpClient.getCredentialsProvider().setCredentials(authScope, credentials);

HttpSolrServer primary = *new* HttpSolrServer("http://localhost:8080"; +
"\" + PRIMARY, httpClient);
primary.add(*new* SolrInputDocument(), 20);


And my Interceptor being

*public* *class* PreemptiveAuthInterceptor *implements*
 HttpRequestInterceptor {

    *public* *void* process(HttpRequest hr, HttpContext context) *throws*
 HttpException, IOException {
        AuthState authState = (AuthState)
context.getAttribute(ClientContext.TARGET_AUTH_STATE);
        *if* (authState.getAuthScheme() == *null*) {
            CredentialsProvider credsProvider = (CredentialsProvider)
context.getAttribute(ClientContext.CREDS_PROVIDER);
            HttpHost targetHost = (HttpHost)
context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
            AuthScope authScope = *new*
 AuthScope(targetHost.getHostName(), targetHost.getPort(), "secure");
            credsProvider.setCredentials(authScope, *new*
 UsernamePasswordCredentials("admin", "password"));

            DigestScheme digestAuth = *new*
 DigestScheme(ChallengeState.TARGET);
            digestAuth.overrideParamter("algorithm", "MD5");
            digestAuth.overrideParamter("realm", "secure");
            digestAuth.overrideParamter("nonce", Long.toString(*new*
 Random().nextLong(), 36));
            digestAuth.overrideParamter("qop", "auth");//   not effective
            digestAuth.overrideParamter("nc", "\" + 1);//nt effective
            digestAuth.overrideParamter("cnonce"
, DigestScheme.createCnonce());
            digestAuth.overrideParamter("opaque", "ba897c2f0f3de9c6f52d");
            digestAuth.overrideParamter("username", "admin");
            authState.update(digestAuth,
credsProvider.getCredentials(authScope));
        }
    }
}

Has any successfully been able to use HttpSolrServer with DIGEST
authentication ? Basic Authentication works but not DIGEST.

I've been struggling with this for two days. Please help.

If I don't use the interceptor I get NonRepeatableRequestException error.

Caused by: org.apache.http.client.ClientProtocolException
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:909)
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)
at
org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:352)
... 43 more
Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot
retry request with a non-repeatable request entity.
at
org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:695)
at
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:522)
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
... 46 more
Java Result: 1

*web.xml*
[image: Inline image 1]

Thanks in advance

Reply via email to