我正在尝试将 filepicker.io(启用安全性)集成到我们的 java 应用程序中。在 java 代码中,我正在为文件选择器集成生成 javascript,使用以下代码进行 base64 编码:
import org.apache.commons.codec.binary.Base64;
import org.codehaus.jackson.map.ObjectMapper;
private Pair<String, String> encodeAndSignPolicy(Policy policy) {
byte[] jsonPolicy = JSON_MAPPER.writeValueAsBytes(policy);
String encodedPolicy = base64UrlEncode(jsonPolicy);
byte[] signature = m_mac.doFinal(encodedPolicy.getBytes(UTF8));
String encodedSignature = base64UrlEncode(signature);
return Pair.create(encodedPolicy, encodedSignature);
}
private String base64UrlEncode(byte[] input) {
Base64 base64 = new Base64(false);
byte[] encodedBytes = base64.encode(input);
return new String(encodedBytes).replace('+', '-').replace('/', '_').replace("\r\n", "");
}
在某些情况下,这可行,但不稳定。我尝试了 url 安全 base64 编码的不同变体,包括不同的 api(apache commons 和 jackson),但每次生成的签名都不稳定。
例如:生成以下两个策略:
working:
policy: {"call":"pick","expiry":1361202256856}
base64 policy: eyJjYWxsIjoicGljayIsImV4cGlyeSI6MTM2MTIwMjI1Njg1Nn0=
base64 signature: 0vQdw1rcfoAYN0sv71OcGArHAF2jozLaaMGR2DZ5DbA=
not working:
Policy: {"call":"pick","expiry":1361202299638}
base64 policy: eyJjYWxsIjoicGljayIsImV4cGlyeSI6MTM2MTIwMjI5OTYzOH0=
base64 signature: wzgaIRume9OZ5Q6TKx-c5LaEabmUmENZk0Dwvm0Y01Y=
和生成的javascript:
filepicker.pickMultiple({
container: 'modal',
openTo: 'GOOGLE_DRIVE',
services:['BOX', 'COMPUTER', 'DROPBOX', 'EVERNOTE', 'FACEBOOK', 'FLICKR', 'FTP', 'GITHUB', 'GOOGLE_DRIVE', 'PICASA', 'WEBDAV', 'GMAIL', 'IMAGE_SEARCH', 'INSTAGRAM', 'URL', 'VIDEO', 'WEBCAM'],
policy: 'eyJjYWxsIjoicGljayIsImV4cGlyeSI6MTM2MTIwMjI5OTYzOH0=',
signature: 'wzgaIRume9OZ5Q6TKx-c5LaEabmUmENZk0Dwvm0Y01Y=',
},
function(FPFiles){
$('#filePickerInput7c').val(JSON.stringify(FPFiles));
$('#filePickerInput7c').change();
},
function(FPError){
console.log(FPError.toString());
}
);
似乎每次签名包含“-”或“_”时都发现它是无效的。如何在 java 中为 filepicker.io 生成有效的签名(和策略)?