3 votes

Requête JAX-WS avec authentification de base

J'essaie d'appeler un Webservice SOAP en utilisant des gestionnaires avec une autorisation de base, mais l'API répond avec 401 non autorisé.

@Override
public boolean handleMessage(SOAPMessageContext context) {
    Boolean outboundProperty = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
    if (outboundProperty.booleanValue()) {
        String authString = parameter.getUser() + ":" + parameter.getPassword();
        try {
             Map<String, List<String>> headers = (Map<String, List<String>>)
                     context.get(MessageContext.HTTP_REQUEST_HEADERS);

             if (null == headers) {
                 headers = new HashMap<String, List<String>>();
             }

             headers.put("Authorization", Collections.singletonList(
                 "Basic " + new String(Base64.encode(authString.getBytes()))));
        } catch(Exception e) {
            log4j.error(e.getMessage(), e);
        }
    }
    return outboundProperty;
}

Lorsque j'utilise l'interface SOAP et que j'ajoute manuellement l'en-tête d'autorisation (valeur du code pendant le débogage), je reçois une réponse du point de terminaison, mais en utilisant le code, cela échoue pour l'instant.

Tout conseil serait très utile. Merci de votre compréhension.

2voto

Spara Points 3700

Vous devrez modifier votre code comme suit :

@Override
public boolean handleMessage(SOAPMessageContext context) {
    Boolean outboundProperty = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
    if(outboundProperty.booleanValue()){
        try{
            String authString = parameter.getUser() + ":" + parameter.getPassword();
            SOAPMessage soapMessage =context.getMessage();
            String authorization = new sun.misc.BASE64Encoder().encode(authString.getBytes());
            soapMessage.getMimeHeaders().addHeader("Authorization","Basic " + authorization);   
            soapMessage.saveChanges(); 
        }catch(Exception e){
            log4j.error(e.getMessage(), e);
        }
    }
    return true;
}

Mise à jour :

Comme expliqué aquí vous devez utiliser Base64Coder de sun.misc.BASE64Encoder() pour l'encodage authString

En outre, vous devez toujours renvoyer true de cette méthode, sinon vous bloquerez le traitement de la chaîne de requêtes du gestionnaire en renvoyant false .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X