GAE Application needing to create Expiring Signed URL's to Google Cloud Storage

前端 未结 3 1987
半阙折子戏
半阙折子戏 2020-12-09 01:12

I was successfully able to create a stand-alone Java Application that creates Expiring Signed URL\'s to assets sitting in Google Cloud Storage. However, I have been unsucce

3条回答
  •  鱼传尺愫
    2020-12-09 01:26

    Two things:

    For googleAccessId use:

    String googleAccessId = service.getServiceAccountName();
    

    And for Signature use:

    SigningResult signingResult = service
                .signForApp(stringToSign.getBytes());
    String encodedSignature = new String(Base64.encodeBase64(
                signingResult.getSignature(), false), "UTF-8");
    

    That's what worked for me. See below a sample signer class:

    public class GcsAppIdentityServiceUrlSigner  {
    
        private static final int EXPIRATION_TIME = 5;
        private static final String BASE_URL = "https://storage.googleapis.com";
        private static final String BUCKET = "my_bucket";
        private static final String FOLDER = "folder";
    
    
        private final AppIdentityService identityService = AppIdentityServiceFactory.getAppIdentityService();
    
        public String getSignedUrl(final String httpVerb, final String fileName) throws Exception {
            final long expiration = expiration();
            final String unsigned = stringToSign(expiration, fileName, httpVerb);
            final String signature = sign(unsigned);
    
            return new StringBuilder(BASE_URL).append("/")
                    .append(BUCKET)
                    .append("/")
                    .append(FOLDER)
                    .append("/")
                    .append(fileName)
                    .append("?GoogleAccessId=")
                    .append(clientId())
                    .append("&Expires=")
                    .append(expiration)
                    .append("&Signature=")
                    .append(URLEncoder.encode(signature, "UTF-8")).toString();
        }
    
        private static long expiration() {
            final long unitMil = 1000l;
            final Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.MINUTE, EXPIRATION_TIME);
            final long expiration = calendar.getTimeInMillis() / unitMil;
            return expiration;
        }
    
        private String stringToSign(final long expiration, String filename, String httpVerb) {
            final String contentType = "";
            final String contentMD5 = "";
            final String canonicalizedExtensionHeaders = "";
            final String canonicalizedResource = "/" + BUCKET + "/" + FOLDER + "/" + filename;
            final String stringToSign = httpVerb + "\n" + contentMD5 + "\n" + contentType + "\n"
                    + expiration + "\n" + canonicalizedExtensionHeaders + canonicalizedResource;
            return stringToSign;
        }
    
        protected String sign(final String stringToSign) throws UnsupportedEncodingException {
            final SigningResult signingResult = identityService
                    .signForApp(stringToSign.getBytes());
            final String encodedSignature = new String(Base64.encodeBase64(
                    signingResult.getSignature(), false), "UTF-8");
            return encodedSignature;
        }
    
        protected String clientId() {
            return identityService.getServiceAccountName();
        }
    }
    

提交回复
热议问题