Como posso decodificar corretamente um pedido SAML em Java (redirecionamento HTTP)?

Estou a trabalhar com um pedido SAML usando a ligação HTTP-redirect. Eu li em outro post que os seguintes passos são necessários para recuperar o conteúdo original de um pedido SAML (parâmetro SAMLRequest no URL):

  1. descodificação de URL
  2. descodificação Base64
  3. inflacionar o conteúdo

Embora esses passos sejam bastante claros para mim, não consigo obter o pedido SAML no formato XML. Creio que o erro está no terceiro passo., talvez haja mais do que uma maneira de inflar bytes? Esta é a função Java que executa os três acima, dado o argumento que é o valor do parâmetro SAML no URL.

private String decodeMessage(String SAMLContent) {
        try {
            //URLDecode, Base64 and inflate data

            //URLDecode
            SAMLContent = URLDecoder.decode(SAMLContent, "UTF-8");

            //Base64 decoding
            SAMLContent = new String(Base64.getDecoder().decode(SAMLContent), "UTF-8");

            //Inflating data
            try {
                byte[] compressed = new byte[10 * SAMLContent.getBytes().length];
                Inflater i = new Inflater(true);
                i.setInput(SAMLContent.getBytes(), 0, SAMLContent.getBytes().length);
                int finalSize = i.inflate(compressed);
                //Exception is thrown here
                SAMLContent = new String(SAMLContent.getBytes(), 0, finalSize, "UTF-8");
                i.end();


            } catch (DataFormatException ex) {
                JOptionPane.showMessageDialog(null, "DFE: " + ex.getMessage());
            }

        } catch (UnsupportedEncodingException ex) {
            JOptionPane.showMessageDialog(null, "UEE: " + ex.getMessage());
        }

        return SAMLContent;

    }

se copiar e colar o resultado do primeiro passo aqui, consigo ver o XML bem formatado no fundo da página, pelo menos a descodificação de URL funciona como pretendido. Se tiver alguma solução, por favor, avise-me, obrigado.

Author: Stefano, 2020-03-22

1 answers

É assim que eu faço. O fluxo é detectar o pedido é HTTP-Redirect, base64 decodificar o pedido e, em seguida, inflá-lo. Os seguintes links são para o código que faz tudo isso em github.

Receber o pedido

Descodificar o pedido

Inflar o XML

Se conseguires

Verificação incorrecta do cabeçalho

Vê isto responde

E pode ser necessário alterar o código de inflação para:

return new String(inflatedData, 0, inflatedBytesLength, "UTF-8");
 3
Author: codebrane, 2020-03-24 18:43:08