我试图在Java中实现相同的算法用于SAML HTTP重定向绑定在此所说明: 如何正确准备用C#中的“HTTP重定向绑定” SAML请求
该算法很简单:
- 建立一个SAML字符串
- 压缩此字符串
- Base64编码字符串
- URLEncode的字符串。
这应该是等价的Java算法:
public String encodeRedirectFormat( String samlXML ) throws IOException{
ByteArrayOutputStream os = new ByteArrayOutputStream();
DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(os);
deflaterOutputStream.write( samlXML.getBytes( "UTF-8" ) );
deflaterOutputStream.close();
os.close();
String base64 = Base64.encodeBase64String( os.toByteArray() );
return URLEncoder.encode( base64, "UTF-8" );
}
我尝试编码最简单的说法:
<saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"/>
这是输出:
eJyzKU7MzTGyciwuTi0qyczPU6jIzckrtgKL2iqVFuVZ5ScWZxZb5SXmphZblSRbBTv6%2BlgZ6RlYJcK0KOnbAQCHfRi3
然后尝试用一个在线工具,解码像
https://rnd.feide.no/simplesaml/module.php/saml2debug/debug.php
输出是无效的。 有人能找出错误? 也许在Java Deflater原理不同?