Google Cloud Storage で、Java で、署名付き URL

スポンサーリンク

Google Cloud Platform のドキュメントには、署名付き URL に関する Python のサンプルコードはあるけど、Java のサンプルコードが無いなと思っていたら・・・

Cloud Storage – 署名付き URL
https://cloud.google.com/storage/docs/access-control/signed-urls

Cloud Storage – プログラムを使用した署名済み URL の作成
https://cloud.google.com/storage/docs/access-control/create-signed-urls-program

このサイトのサンプルがシンプルでした。

How to Create Google Cloud Storage Signed URL In Java
https://www.quickprogrammingtips.com/google-cloud/how-to-create-google-cloud-storage-signed-url-in-java.html

Cloud Storage にバケットを作成し、テキストファイルをアップロードします。URL が https://storage.googleapis.com/mybacketname/dummy.txt だとすると、アクセスしても Access Denied となります。署名付き URL を発行し、1分間だけ https://storage.googleapis.com/mybacketname/dummy.txt にアクセスできるようにしてみます。

まず、https://console.cloud.google.com/apis/credentials で、「認証情報を作成」を選択し、「サービスアカウントキー」を選択し、JSON ファイルをダウンロードしておきます。そして、Java プロジェクトの src/main/resources にでも置いておきます。

    String url = "https://storage.googleapis.com/mybacketname/dummy.txt";

    Resource resource = new ClassPathResource("myproject-xxx.json");
    ServiceAccountCredentials serviceAccountCredentials = ServiceAccountCredentials.fromStream(resource.getInputStream());
    String clientEmail = serviceAccountCredentials.getClientEmail();

    long now = System.currentTimeMillis();
    long expiredTimeInSeconds = (now + 60 * 1000L) / 1000;
    String expiredTime = Long.toString(expiredTimeInSeconds);

    String input =
            "GET" + "\n"
            + "" + "\n"
            + "" + "\n"
            + expiredTime + "\n"
            + "/mybucketname/dummy.txt";

    Signature signature = Signature.getInstance("SHA256withRSA");
    signature.initSign(serviceAccountCredentials.getPrivateKey());
    signature.update(input.getBytes("UTF-8"));
    byte[] bytes = signature.sign();
    String base64 = Base64.getEncoder().encodeToString(bytes);

    String encoded = URLEncoder.encode(base64, "UTF-8");

    String signedUrl = url
            + "?GoogleAccessId=" + serviceAccountCredentials.getClientEmail()
            + "&Expires=" + expiredTime
            + "&Signature=" + encoded;

signedUrl が署名付き URL になるのですが、1分間だけ誰でもその URL にアクセスできるようになります。

GitHub の Google のサンプルはこちら。
https://github.com/GoogleCloudPlatform/google-cloud-java/blob/master/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java