Grails Base64解码授权标头在解码时格式错误

时间:2013-01-08 15:36:53

标签: java grails encoding groovy base64

我有一个grails控制器,base64解码授权头。我使用CURL从PHP脚本发送了这个。

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "testindia01@test.com:india123");

我的grails控制台记录显示:

Authorization raw: Basic dGVzdGluZGlhMDFAdGVzdC5jb206aW5kaWExMjM=, isBase64: true
Authorization decoded: ´"q—ïÕ—•πë•Ñ¿≈—ïÕ–πçΩ¥È•πë•Ñƒ»Ã

在上面的例子中,我使用的是Commons Base64类,但使用Groovy内置的decodeBase64会产生相同的结果。

授权原始进入是正确的。如果我复制它并通过PHP的ecode推送它然后它正确解码。

echo base64_decode('dGVzdGluZGlhMDFAdGVzdC5jb206aW5kaWExMjM=');

如果我将字符串直接复制到控制器中,例如

def decode = new String(Base64.encodeBase64("dGVzdGluZGlhMDFAdGVzdC5jb206aW5kaWExMjM="))

然后这也正确解码。

我通过请求获取标题

def auth = request.getHeader("Authorization")

我用

测试它是一个有效的base64字符串
Base64.isBase64(auth)

只是解码失败了。我试过改变解码上的编码。

def decoding = new String(auth.decodeBase64(),“UTF-8”)

与ISO-8859-1和Windows-1252等其他编码一样,但每次返回不同的格式错误的字符串。

我也尝试在CURL请求上手动设置Accept-Encoding。

我没有想法:(

1 个答案:

答案 0 :(得分:1)

这是因为“Basic”已包含在getHeader返回值的一部分中。如果我脱掉它就行了。 Base64.isBase64只检查字符是否为base64字母,因此必须使用“Basic”。