1

我正在尝试将 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 生成有效的签名(和策略)?

4

0 回答 0