filepicker.io (セキュリティを有効にして) を Java アプリケーションに統合しようとしています。Java コードでは、base64 エンコーディングに次のコードを使用して、ファイルピッカー統合用の JavaScript を生成しています。
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", "");
}
場合によってはこれでうまくいきますが、安定していません。さまざまな API (apache commons と jackson) を含む、URL セーフな base64 エンコーディングのさまざまなバリエーションを試しましたが、生成される署名は毎回不安定です。
たとえば、次の 2 つのポリシーが生成されます。
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 の有効な署名 (およびポリシー) を生成するにはどうすればよいですか?