Azure хранилище BLOB-объектов java генерировать токен SAS всегда выбрасывать sr обязательно. Не может быть пустой ошибки - PullRequest
0 голосов
/ 10 апреля 2020

Я хочу использовать Java для генерации токена SAS, вот что я делаю:

 public static String GetSASToken(String resourceUri, String keyName, String key) {
        long epoch = System.currentTimeMillis() / 1000L;
        int week = 60 * 30 * 1000;
        String expiry = Long.toString(epoch + week);

        String sasToken = null;
        try {
            String stringToSign = URLEncoder.encode(resourceUri, "UTF-8") + "\n" + expiry;
            String signature = getHMAC256(key, stringToSign);
            sasToken =
                    "SharedAccessSignature sr=" + URLEncoder.encode(resourceUri, "UTF-8") + "&sig="
                            +
                            URLEncoder.encode(signature, "UTF-8") + "&se=" + expiry + "&skn="
                            + keyName;
        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();
        }

        return sasToken;
    }

    public static String getHMAC256(String key, String input) {
        Mac sha256_HMAC = null;
        String hash = null;
        try {
            sha256_HMAC = Mac.getInstance("HmacSHA256");
            SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
            sha256_HMAC.init(secret_key);
            Encoder encoder = Base64.getEncoder();

            hash = new String(encoder.encode(sha256_HMAC.doFinal(input.getBytes("UTF-8"))));

        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return hash;
    }

Этот код просто скопирован с веб-сайта Microsoft,

Затем в основном класс:

  String key = "xxxxxHh9jP1ZOTYZI/z1OCVeThsjK00sSc3TYUuiHJQ==";
        String kn = "frankbucket";
        String url = "https://frankbucket.blob.core.windows.net/mycontainer";
        System.out.print(AzureSASTokenGenerator.GetSASToken(url, kn, key));

когда я запускаю это, я получаю SAS ниже:

SharedAccessSignature sr = https% 3A% 2F% 2Ffrankbucket.blob.core. windows .net% 2Fmycontainer & sig = xxxj7Fgbkz5OSag% 2BzFQAzBkIdd3I1J9AmFwxjcQg% 3D & se = 1588299503 & skn = frankbucket

В Javascript:

var blobUri = 'https://frankbucket.blob.core.windows.net';
    var token =
        "SharedAccessSignature sr=https%3A%2F%2Ffrankbucket.blob.core.windows.net%2Fmycontainer&sig=ZA5fgKKny5%2BzdffvdEmy6WdsqqpoMsssssYYM9ruXgAdo0%3D&se=1588299257&skn=frankbucket";
    var blobService = AzureStorage.Blob.createBlobServiceWithSas(blobUri, token);

    blobService.listBlobsSegmented('mycontainer', null, function(error, results) {

Когда я его запустил, я получил ошибку ниже:

1016 ea315aa c -001e-00a0-0700-0f2e4d000000 Время: 2020-04-10T06: 22: 18.2383162Zsr является обязательным. Не может быть пустым

Понятия не имею, в чем проблема, я получил код веб-сайта Microsoft, но он не работает.

Может кто-нибудь показать мне рабочий пример для этого?

Надеюсь услышать ваш совет.

Спасибо

1 Ответ

2 голосов
/ 13 апреля 2020

Если вы хотите узнать, как создать учетную запись sas-токена с java, обратитесь к следующему коду

  public void callblobRestAPIWithSas() throws NoSuchAlgorithmException, InvalidKeyException, IOException {
 // 1. create account sas token
        SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
        fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        cal.add(Calendar.DATE, -2);
        String start = fmt.format(cal.getTime());
        cal.add(Calendar.DATE, 4);
        String expiry =  fmt.format(cal.getTime());
        String StorageAccountName = "blobstorage0516";
        String StorageAccountKey = "";
        String apiVersion="2019-07-07";
        String  resource ="sco";
        String permissions ="rwdlac";
        String service = "b";
        String stringToSign = StorageAccountName + "\n" +
                permissions +"\n" +  // signed permissions
                service+"\n" + // signed service
                resource+"\n" + // signed resource type
                start + "\n" + // signed start
                expiry + "\n" + // signed expiry
                "\n" +  // signed IP
                "https\n" + // signed Protocol
                apiVersion+"\n"; // signed version

        SecretKeySpec secretKey = new SecretKeySpec(Base64.getDecoder().decode(StorageAccountKey), "HmacSHA256");
        Mac sha256HMAC = Mac.getInstance("HmacSHA256");
        sha256HMAC.init(secretKey);
        String signature=Base64.getEncoder().encodeToString(sha256HMAC.doFinal(stringToSign.getBytes("UTF-8")));
        String sasToken = "sv=" + apiVersion +
                "&ss=" + service+
                "&srt=" + resource+
                "&sp=" +permissions+
                "&se=" + URLEncoder.encode(expiry, "UTF-8") +
                "&st=" + URLEncoder.encode(start, "UTF-8") +
                "&spr=https" +
                "&sig=" + URLEncoder.encode(signature,"UTF-8");
        //2. test the sas token
       String resourceUrl="https://blobstorage0516.blob.core.windows.net/test/help.txt"; // your blob url
        URL url = new URL(resourceUrl+"?"+sasToken);
        OkHttpClient httpClient =  new OkHttpClient().newBuilder().build();
        Request request = new Request.Builder()
                .url(url)
                .method("GET", null)
                .build();

        okhttp3.Response response = httpClient.newCall(request).execute();
        if(response.isSuccessful()){
            System.out.println("The blob content : "+ response.body().string());

        }
}

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...