>>> import base64
>>> data = '{"u": "test"}'
>>> code = base64.b64encode(data)
>>> code
'eyJ1IjogInRlc3QifQ=='
Note the trailing ==
to make len a multiple of 4. This decodes properly
>>> len(code)
20
>>> base64.b64decode(code)
'{"u": "test"}'
>>> base64.b64decode(code) == data
True
without the == padding (this is how many things are encoded for e.g. access tokens)
>>> base64.b64decode(code[0:18]) == data
...
TypeError: Incorrect padding
However, you can add back the padding
>>> base64.b64decode(code + "==") == data
True
Or add an arbitrary amount of padding (it will ignore extraneous padding)
>>> base64.b64decode(code + "========") == data
True
This last property of python's base64 decoding ensures that the following code
adding 3 padding =
will never succumb to the TypeError and will always produce the same result.
>>> base64.b64decode(code + "===") == data
True
It's clumsy but effective method to deal with strings from different implementations of base64 encoders
That is not quite right. Modulo alone isn't going to give you the number of padding characters you need. This works: