Как правильно декодировать запрос SAML в Java (перенаправление HTTP)? - PullRequest
0 голосов
/ 22 марта 2020

Я работаю с запросом SAML, используя привязку HTTP-перенаправления. В другом посте я прочитал, что для получения исходного содержимого запроса SAML (параметр SAMLRequest в URL) требуются следующие шаги:

  1. Декодирование URL
  2. Декодирование Base64
  3. Раздувание контента

Хотя эти шаги мне совершенно понятны, я не могу получить запрос SAML в формате XML. Я считаю, что ошибка заключается в третьем шаге, может быть, существует более одного способа, чтобы накачать байты? Это функция Java, которая выполняет три указанных выше параметра, учитывая аргумент, который является значением параметра SAML в 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;

    }

Если я скопирую и вставлю выходные данные первого шага здесь , я вижу хорошо отформатированный XML внизу страницы, так что, по крайней мере, декодирование URL работает как задумано. Если у вас есть решение, пожалуйста, дайте мне знать, спасибо.

1 Ответ

1 голос
/ 23 марта 2020

Вот как я это делаю. Поток обнаруживает запрос HTTP-перенаправления, base64 декодирует запрос и затем раздувает его. Следующие ссылки ведут на код, который делает все это в github.

Получите запрос

Расшифруйте запрос

Наполните XML

Если вы получаете

Неправильная проверка заголовка

проверьте этот ответ

и вам может потребоваться изменить код надувания на:

return new String(inflatedData, 0, inflatedBytesLength, "UTF-8");
...