令我惊讶的是,当我在Dart中将字符串转换为Base64Url时,我得到了一个以=
填充字符结尾的字符串。
import 'dart:convert';
main() {
String credentials = "username:password";
String encoded = base64Url.encode(utf8.encode(credentials));
print(encoded); // dXNlcm5hbWU6cGFzc3dvcmQ=
}
我认为Base64Url的重点是删除URL中不好的字符。显然不是。 docs甚至将其列出。那是否意味着我必须自己手动将其删除?
final noPadding = encoded.replaceAll(RegExp('='), ''); // dXNlcm5hbWU6cGFzc3dvcmQ
答案 0 :(得分:1)
base64url
的{{3}}(URL和文件名安全)仅将普通+
的第62个(/
)和第63个(base64
)字符替换为-
和_
。它不会替换填充字符(=
),而是发出以下语句:
在URI中使用填充字符“ =”通常是按百分比编码的,但是如果隐式知道数据长度,则可以通过跳过填充来避免这种情况。
虽然可以删除填充,但您必须要小心,因为它不会自动处理,如果您不确定首先使用{{3 }}。
相反,我建议只使用spec类中可用的百分比编码,因为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中的预期行为,并且保留了整个字符串,因此它没有待稍后标准化。