# Digest Authentifizierung



## Tashtego (29. Jun 2020)

Hallo.

Ich habe einen FTP Zugang, der von Basic auf Digest Authentifizierung geändert wurde. Ich habe bereits alles mögliche probiert, bekomme aber immer 403 Forbidden. Und das blöde daran: Über den Browser klappt Basic Auth und ich komme an die Dateien... Was sehe ich hier noch nicht? Oder was mache ich anders? Hat jemand ne Idee?


```
package bla;

import java.io.IOException;
import java.net.URL;

import org.apache.http.Header;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.MalformedChallengeException;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.AuthCache;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.auth.DigestScheme;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

/**
 *
 * @author me
 *
 */
public class DigestAuthentication {

    private final static String uri = "https://some-url.com:443";

    private static HttpHost target;

    public static void main(String[] args) throws IOException {

        URL url = new URL(uri);
        target = new HttpHost(url.getHost(), url.getPort(), url.getProtocol());

        if(target == null) {
            System.out.println("Setup was unsuccesfull");
            return;
        }

        Header challengeHeader = getAuthChallengeHeader();
        if(challengeHeader == null) {
            System.out.println("Setup was unsuccesfull");
            return;
        }

        getWithDigestAuth(challengeHeader, "/some-folder/");

    }

    /**
     *
     * @return
     */
    private static Header getAuthChallengeHeader() {
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            CloseableHttpResponse response = httpClient.execute(new HttpGet(uri));
            return response.getFirstHeader("WWW-Authenticate");
        } catch(IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     *
     * @param challengeHeader
     * @param request
     * @throws IOException
     */
    private static void getWithDigestAuth(Header challengeHeader, String request) throws IOException {

        CredentialsProvider credsProvider = new BasicCredentialsProvider();
        credsProvider
                .setCredentials(new AuthScope(AuthScope.ANY), new UsernamePasswordCredentials("user", "pwd"));

        try (CloseableHttpClient httpclient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider)
                .build()) {

            AuthCache authCache = new BasicAuthCache();
            DigestScheme digestAuth = new DigestScheme();
            digestAuth.overrideParamter("realm", "Restricted");
            digestAuth.overrideParamter("qop", "auth");
            digestAuth.overrideParamter("algorithm", "MD5");
            //digestAuth.overrideParamter("nonce", Long.toString(new Random().nextLong(), 36));
            //digestAuth.overrideParamter("nc", "2");
            digestAuth.overrideParamter("cnonce", DigestScheme.createCnonce());
            digestAuth.overrideParamter("opaque", "???");

            digestAuth.processChallenge(challengeHeader);
            authCache.put(target, digestAuth);

            HttpClientContext localContext = HttpClientContext.create();
            localContext.setAuthCache(authCache);

            System.out.println("Executing request to target " + target + request);
            try (CloseableHttpResponse response = httpclient.execute(target, new HttpGet(request), localContext)) {
                System.out.println(response.getStatusLine());
                System.out.println(EntityUtils.toString(response.getEntity()));
            } catch(Exception e) {
                System.out.println("Error while executing HTTP GET request");
                e.printStackTrace();
            }
        } catch(MalformedChallengeException e) {
            e.printStackTrace();
        }
    }
}
```


----------



## LimDul (29. Jun 2020)

Hmm, du schreibst FTP Zugang, aber unten hast du HTTP Zugriffe? Ich gehe davon aus, dass du auch HTTP meinst, weil bei FTP wären mir komplizierte Verfahren als user+Passwort neu (deswegen gibt es ja SFTP & Co)


----------



## Tashtego (30. Jun 2020)

Konnte es nicht mehr editieren. Klar, war HTTP. Ideen?


----------



## Tashtego (30. Jun 2020)

Hat sich erledigt, Accept Header hat gefehlt.


----------

