spec для base64url
(URL и имя файла безопасны) заменяет только 62-й (+
) и 63-й (/
) символы обычного base64
на -
и _
соответственно. Он не заменяет символ заполнения (=
), а вместо этого делает следующее утверждение:
Символ заполнения "=" обычно кодируется в процентах при использовании в URI, но если длина данных известна неявно, этого можно избежать, пропустив заполнение.
Хотя можно удалить заполнение, вы должны быть осторожны, поскольку это не обрабатывается автоматически, и метод декодирования выдаст ошибку, если вы не уверены, что сначала восстановите заполнение, используя что-то вроде normalize()
.
Вместо этого я бы рекомендовал использовать только процентное кодирование, которое доступно в классе Uri
, поскольку реализация Dart base64 уже автоматически поддерживает строки в процентном кодировании:
import 'dart:convert';
main() {
String input = 'username:password';
String encoded = Uri.encodeComponent(base64Url.encode(utf8.encode(input)));
print(encoded); // dXNlcm5hbWU6cGFzc3dvcmQ%3D
String decoded = utf8.decode(base64Url.decode(encoded));
print(decoded); // username:password
}
Кроме того, если вы передаете кодированные строки base64url
как часть URL-адреса, имеет смысл в любом случае использовать процентное кодирование, поскольку это является ожидаемым поведением в URL-адресе и сохраняет всю строку, поэтому ее не нужно нормализуется позже.