Changeset 1532


Ignore:
Timestamp:
2010-05-11 11:42:49 (3 years ago)
Author:
jgou
Message:

fix digest authentication (was broken due to restlet upgrade) ; see #317

Location:
trunk/modules/kauri-security
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/modules/kauri-security/kauri-security-auth-methods/src/main/java/org/kauriproject/security/providers/DigestAuthenticationMethod.java

    r1525 r1532  
    3030import org.restlet.data.ChallengeResponse; 
    3131import org.restlet.data.ChallengeScheme; 
    32 import org.restlet.data.Parameter; 
    3332import org.restlet.data.Status; 
    3433import org.restlet.ext.crypto.internal.CryptoUtils; 
    35 import org.restlet.util.Series; 
    3634import org.springframework.security.Authentication; 
    3735import org.springframework.security.AuthenticationException; 
     
    8381        if (!cr.getScheme().equals(ChallengeScheme.HTTP_DIGEST)) return null; 
    8482             
    85         final Series<Parameter> credentials = cr.getParameters(); 
    86         final String username = credentials.getFirstValue("username"); 
    87         final String crealm = credentials.getFirstValue("realm"); 
    88         final String nonce = credentials.getFirstValue("nonce"); 
    89         final String uri = credentials.getFirstValue("uri"); 
    90         final String cresponse = credentials.getFirstValue("response"); 
    91         final String qop = credentials.getFirstValue("qop"); 
    92         final String nc = credentials.getFirstValue("nc"); 
    93         final String cnonce = credentials.getFirstValue("cnonce"); 
    94  
     83        final String username = cr.getIdentifier(); 
     84        final String crealm = cr.getRealm(); 
     85        final String nonce = cr.getServerNonce(); 
     86        final String uri = cr.getDigestRef().toString(); 
     87        final String cresponse = new String(cr.getSecret()); 
     88        final String qop = cr.getQuality(); 
     89        final String nc = cr.getServerNounceCountAsHex(); 
     90        final String cnonce = cr.getClientNonce(); 
     91         
    9592//        if (!isNonceValid(nonce)) { 
    9693//            throw new MalformedAuthenticationRequestException("The supplied nonce is invalid"); 
     
    9895 
    9996        // Check all required parameters were supplied (ie RFC 2069) 
    100         if ((username == null) || (realm == null) || (nonce == null) || (uri == null) || (response == null)) { 
     97        if ((username == null) || (realm == null) || (nonce == null) || (uri == null) || (cresponse == null)) { 
    10198            throw new MalformedAuthenticationRequestException("Missing parameter in Authenticate header"); 
    10299        } 
     
    236233        // there is only one challenge scheme, that of the Guard. 
    237234        ChallengeRequest challengeRequest = new ChallengeRequest(ChallengeScheme.HTTP_DIGEST, realm.getName()); 
     235         
     236        challengeRequest.setServerNonce(CryptoUtils.makeNonce(getServerKey())); 
     237 
     238        // indicate stale nonce was found in challenge response 
     239        challengeRequest.setStale(response.getAttributes().containsKey("stale")); 
    238240 
    239241        response.setStatus(Status.CLIENT_ERROR_UNAUTHORIZED); 
    240242        response.setChallengeRequest(challengeRequest); 
    241  
    242         final Series<Parameter> parameters = challengeRequest 
    243                 .getParameters(); 
    244  
    245         //TODO: domain? 
    246         parameters.add("domain", domain); 
    247  
    248         parameters.add("nonce", CryptoUtils.makeNonce(getServerKey())); 
    249  
    250         if (response.getAttributes().containsKey("stale")) { 
    251             // indicate stale nonce was found in challenge response 
    252             parameters.add("stale", "true"); 
    253         } 
    254          
    255243    } 
    256244 
  • trunk/modules/kauri-security/kauri-security-impl/src/test/java/org/kauriproject/security/test/SecurityTest.java

    r1525 r1532  
    114114 
    115115        //DIGEST authentication 
    116         /* 
    117116        doTestUnauthenticated(externalPrefix, "/test", externalSuffix, 200); 
    118117        doTestUnauthenticated(externalPrefix, "/digest/user", externalSuffix, 401); 
     
    126125        doTestDigest(externalPrefix, "/digest/user", externalSuffix, ADMIN, ADMINPW, 403); 
    127126        doTestDigest(externalPrefix, "/digest/admin", externalSuffix, ADMIN, ADMINPW, 200); 
    128         */ 
    129127 
    130128        //FORM-based authentication 
     
    164162        // basic auth does not suffice for strength 2, we should get a new challenge 
    165163        doTestBasic(externalPrefix, "/strengths/strength2", externalSuffix, USER, USERPW, 401); 
    166 //        doTestDigest(externalPrefix, "/strengths/strength2", externalSuffix, USER, USERPW, 200); 
     164        doTestDigest(externalPrefix, "/strengths/strength2", externalSuffix, USER, USERPW, 200); 
    167165        // there's no method with strength 3 
    168166        doTestBasic(externalPrefix, "/strengths/strength3", externalSuffix, USER, USERPW, 500); 
     
    198196 
    199197        //DIGEST authentication 
    200         /* 
    201198        doTestDigest(internalPrefix, "/test", internalSuffix, USER, USERPW, 200); 
    202199        doTestDigest(internalPrefix, "/digest/user", internalSuffix, USER, USERPW, 200); 
     
    206203        doTestDigest(internalPrefix, "/digest/user", internalSuffix, ADMIN, ADMINPW, 403); 
    207204        doTestDigest(internalPrefix, "/digest/admin", internalSuffix, ADMIN, ADMINPW, 200); 
    208         */ 
    209205 
    210206    } 
     
    278274        // first request: 
    279275        Request request = createRequest(path); 
    280         Reference ref = request.getResourceRef(); 
    281276        Response response = cd.handle(request); 
    282277 
     
    291286        } 
    292287         
    293         ChallengeRequest challengeRequest = response.getChallengeRequests().get(0); 
    294          
    295288        // second request: 
    296         request = new Request(Method.GET, path); 
    297  
    298         ChallengeResponse challengeResponse = new ChallengeResponse(ChallengeScheme.HTTP_DIGEST, user, password); 
    299         Series<Parameter> cReqParams = challengeRequest.getParameters(); 
    300         Form form = new Form(); 
    301         form.add("username", user); 
    302         form.add("uri", ref.getPath()); 
    303  
    304         // Retrieve values sent by the server 
    305         form.add(cReqParams.getFirst("nonce")); 
    306         form.add(cReqParams.getFirst("realm")); 
    307         form.add(cReqParams.getFirst("domain")); 
    308         form.add(cReqParams.getFirst("algorithm")); 
    309         form.add(cReqParams.getFirst("qop"));  
    310         form.add("cnonce", Long.toHexString((long)(Math.random()*10000))); 
    311         form.add("nc", "1"); 
    312          
    313         String a1 = DigestUtils.toMd5(form.getFirstValue("username") + ":" + form.getFirstValue("realm") + ":" + password); 
    314         String a2 = DigestUtils.toMd5(request.getMethod() + ":" + form.getFirstValue("uri")); 
    315          
    316         form.add("response", DigestUtils.toMd5(a1 + ":" + form.getFirstValue("nonce") + ":" + form.getFirstValue("nc") + ":" + form.getFirstValue("cnonce") + ":" + form.getFirstValue("qop") + ":" + a2)); 
    317  
    318         //challengeResponse.setCredentialComponents(form); 
    319         challengeResponse.setParameters(form); 
     289         
     290        // Complete the challengeResponse object according to the server's data 
     291        // 1- Loop over the challengeRequest objects sent by the server. 
     292        ChallengeRequest c1 = null; 
     293        for (ChallengeRequest challengeRequest : response.getChallengeRequests()) { 
     294            if (ChallengeScheme.HTTP_DIGEST.equals(challengeRequest.getScheme())) { 
     295                c1 = challengeRequest; 
     296                break; 
     297            } 
     298        } 
     299 
     300        // 2- Create the Challenge response used by the client to authenticate 
     301        // its requests. 
     302        ChallengeResponse challengeResponse = new ChallengeResponse(c1, response, user, password); 
     303        //resource.setChallengeResponse(challengeResponse); 
    320304        request.setChallengeResponse(challengeResponse); 
    321305         
Note: See TracChangeset for help on using the changeset viewer.