2017-07-27 3 views
0

J'essaie d'écrire un script groovy (le code java est le bienvenu;)) qui devrait me permettre d'effectuer l'authentification Digest. Le besoin étant d'être capable d'utiliser Digest auth dans SOAPUI parce que SOAP ne supporte pas ce type d'authentification natif.Authentification Groovy Digest

Pour tester mon script j'ai utilisé une URL: https://postman-echo.com/digest-auth

D'abord, j'accéder à la page via un navigateur Web pour obtenir l'en-tête WWW-Authenticate. Digest realm = "Utilisateurs", nonce = "81lEQmJGxRb3Us9jVJPYlDpjw11On7zW", qop = "auth"

Puis je tape le bon utilisateur + mot de passe et vérifiez l'en-tête d'autorisation calculée par le navigateur Web. Voici le résultat:

Digest username="postman", realm="Users", nonce="81lEQmJGxRb3Us9jVJPYlDpjw11On7zW", uri="/digest-auth", response="82884fe7c55a19e80e8c8dea7ba1aece", qop=auth, nc=00000001, cnonce="89aa538367b9069a" 

Puis j'ai utilisé les mêmes données pour effectuer le calcul des données de réponse en utilisant mon script. Voici le résultat:

Digest username="postman", realm="Users", nonce="81lEQmJGxRb3Us9jVJPYlDpjw11On7zW", uri="/digest-auth", response="a6767f0a78d17e0cab90df65ec2ace5c", qop=auth,nc="00000001",cnonce="03d476861afd384510f2cb80ccfa8511" 

Ma réponse est différente de la réponse calculée par le navigateur Web.

Qu'est-ce que je fais de mal?

Voici mon script:

import org.apache.commons.codec.digest.DigestUtils 
import com.eviware.soapui.impl.wsdl.actions.teststep.RunFromTestStepAction 


// URL: https://postman-echo.com/digest-auth 

wwwAuthHeader = "Digest realm=\"Users\", nonce=\"81lEQmJGxRb3Us9jVJPYlDpjw11On7zW\", qop=\"auth\"" 

def realmArray = wwwAuthHeader.split(",") 

def realm = realmArray[0].split("=")[1] 
def nonce = realmArray[1].split("=")[1] 
def qop = realmArray[2].split("=")[1] 

def uri = "/digest-auth" 
def user = "postman" 
def pass = "password" 
def method ="GET" 



def resp = md5(user,realm,pass,method,uri,nonce) 

log.info "resp: "+resp 

def cnonce = DigestUtils.md5Hex(user) 

def authorizationString = "Digest username=\"$user\", realm=$realm,   nonce=$nonce, uri=\"$uri\", response=\"$resp\", qop=auth,nc=\"00000001\",cnonce=\"$cnonce\"" 

log.info "authorizationString: " + authorizationString 

// methods 

def md5(user, realm, pass, method, String uri, nonce) { 

    def A1 = DigestUtils.md5Hex ("$user:$realm:$pass") 
    def A2 = DigestUtils.md5Hex ("$method:$uri") 

    return DigestUtils.md5Hex ("$A1:$nonce:$A2") 
} 

Répondre

1

Si vous voulez juste d'écrire un script groovy (code java est le bienvenu aussi, que votre question se lit) qui vous permet d'effectuer l'authentification Digest, est ici quelque chose pour votre référence:

@Grab(group='org.apache.httpcomponents', module='httpclient', version='4.5.3') 

import org.apache.http.auth.UsernamePasswordCredentials; 
import org.apache.http.client.CredentialsProvider; 
import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.BasicCredentialsProvider; 
import org.apache.http.auth.AuthScope; 
import org.apache.http.HttpResponse; 
import org.apache.http.impl.client.HttpClients; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.util.EntityUtils; 

CredentialsProvider credsProvider = new BasicCredentialsProvider(); 
credsProvider.setCredentials(
     new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), 
     new UsernamePasswordCredentials("postman", "password")); 

CloseableHttpClient httpClient = HttpClients.custom() 
     .setDefaultCredentialsProvider(credsProvider) 
     .build(); 

HttpGet httpGet = new HttpGet("https://postman-echo.com/digest-auth"); 
HttpResponse httpResponse = httpClient.execute(httpGet); 
String content = EntityUtils.toString(httpResponse.getEntity()); 
println content; 

Run et la sortie ressemble à ceci:

{"authenticated":true}