背景
问题产生的背景是,前端把token放在了cookie中传给了后台接口,而token是一个base64编码后的字符串,拿到这个字符串之后,base64解码时产生了这个报错:illegal base64 data at input byte 42。
编解码对应的代码如下:
base64.StdEncoding.EncodeToString([]byte("encode")) // 编码
decode, err := base64.StdEncoding.DecodeString("decode") // 解码
原因分析
报错的原因是在解码时,遇到了base64不认识的字符,需要检查下字符串是否包含了非法的字符。这里的原因是浏览器会将cookie中的所有字符串数据自动url编码后再传输,从而导致了base64解码失败。
另外,如果编解码使用的规则不一致也会导致解码失败,比如编码使用的是StdEncoding,而解码使用的是RawStdEncoding,这两个编解码器一个是有填充的,一个是无填充的。
解决办法
在给出解决方案之前,我们先来看下base64包中这四个全局声明的编解码器的作用和区别,了解之后自然就能找到解决办法。
StdEncoding
// StdEncoding is the standard base64 encoding, as defined in
// RFC 4648.
var StdEncoding = NewEncoding(encodeStd)
翻译一下,StdEncoding使用的是RFC4648中规定的标准base64字符集来编解码,并且有填充,这个字符集中包含了+和/这两个url编码时会转换的字符。
URLEncoding
// URLEncoding is the alternate base64 encoding defined in RFC 4648.
// It is typically used in URLs and file names.
var URLEncoding = NewEncoding(encodeURL)
URLEncoding是RFC4648中规定的另一套备用base64编码字符集,并且有填充,常用于URL编码场景和文件名等。这个字符集中不包含url编码会转换的字符,也就是将+和/号分别替换为了-和_。
RawStdEncoding
// RawStdEncoding is the standard raw, unpadded base64 encoding,
// as defined in RFC 4648 section 3.2.
// This is the same as StdEncoding but omits padding characters.
var RawStdEncoding = StdEncoding.WithPadding(NoPadding)
RawStdEncoding使用的是标准的base64字符集进行编解码,并且无填充。
RawURLEncoding
// RawURLEncoding is the unpadded alternate base64 encoding defined in RFC 4648.
// It is typically used in URLs and file names.
// This is the same as URLEncoding but omits padding characters.
var RawURLEncoding = URLEncoding.WithPadding(NoPadding)
RawURLEncoding使用的是备用的base64字符集进行编解码,并且无填充。
所以,只需要使用URLEncoding或者RawURLEncoding来进行编解码,问题解决。