我有一个 base64 解码授权 header 的 grails Controller 。我使用 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 会产生相同的结果。
传入的 Authorization raw 是正确的。如果我复制它并通过 PHP 的 ecode 推送它,那么它就会正确解码。
echo base64_decode('dGVzdGluZGlhMDFAdGVzdC5jb206aW5kaWExMjM=');
如果我将字符串直接复制到 Controller 中,例如
def decode = new String(Base64.encodeBase64("dGVzdGluZGlhMDFAdGVzdC5jb206aW5kaWExMjM="))
然后这也正确解码。
通过请求获取header
def auth = request.getHeader("Authorization")
我测试它是一个有效的 base64 字符串
Base64.isBase64(auth)
只是解码失败了。我试过在解码器上更改编码。
def decoded = new String(auth.decodeBase64(), "UTF-8")
以及其他编码,如 ISO-8859-1 和 Windows-1252,但每次都会返回不同的格式错误的字符串。
我也尝试过在 CURL 请求上手动设置 Accept-Encoding。
我没有想法:(
最佳答案
这是因为“Basic”已作为 getHeader 返回值的一部分包含在内。如果我把它去掉它就可以了。 Base64.isBase64 只检查字符是否在 base64 字母表中,因此“Basic”一定是。
关于java - 授权 header 的 Grails Base64 解码在解码时格式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14218542/