Создание хранилища файлов Azure SAS в Salesforce не работает - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь создать подпись общего доступа (SAS) для хранилища файлов Azure в Salesforce Apex, но нигде не получаю.Вот мой код:

String link = 'https://<accountName>.file.core.windows.net/<folderName>/test.txt';
String key = '...' // key of the account

String spe = 'r'; //read
String st = '2018-06-07T08:49:00Z';
String se = '2018-06-09T08:49:00Z';
String res = '/file/<accountName>/<folderName>/test.txt';
String sv = '2017-11-09';
String sr = 'f'; // file
String spr = 'https';

String sts = spe + '\n'  +
    st + '\n' +
    se + '\n' +
    res + '\n' +
    spr + '\n'+
    sv + '\n';  

Blob data = crypto.generateMac('HmacSHA256', Blob.valueOf(sts), Blob.valueOf(key));
String sas = EncodingUtil.base64Encode(data);
sas = EncodingUtil.urlEncode(sas, 'UTF-8');
link += '?sv=' + sv + '&st=' + st + '&se=' + se + '&sr=' + sr + '&sp=' + spe 
               + '&spr=' + spr + '&sig=' + sas;
System.debug(link);

Когда я копирую и вставляю ссылку в браузере, я получаю ответ:

<Error>
  <Code>AuthenticationFailed</Code>
  <Message>
    Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:... Time:2018-06-07T21:56:01.7374549Z
  </Message>
  <AuthenticationErrorDetail>
    Signature did not match. String to sign used was r 2018-06-07T08:49:00Z 2018-06-09T08:49:00Z /file/<accountName>/<folderName>/test.txt https 2017-11-09
  </AuthenticationErrorDetail>
</Error>

Что я здесь не так делаю?

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Как упомянуто @superfell в комментариях, проблема связана со следующей строкой кода:

Blob data = crypto.generateMac('HmacSHA256', Blob.valueOf(sts), Blob.valueOf(key));

Пожалуйста, измените эту строку кода на:

Blob data = crypto.generateMac('HmacSHA256', Blob.valueOf(sts), EncodingUtil.base64Decode(key));

, и выне должен получить эту ошибку.По сути, ключ является строкой в ​​кодировке base64, и вам нужно использовать правильный метод декодирования для получения байтового массива.

0 голосов
/ 08 июня 2018

Спасибо @Gaurav.Ваше решение сработало, однако оно было неполным.Это все еще давало мне ошибку.Вот что я сделал, чтобы все заработало:

String spe = 'r';
String st = '';
String se = '2018-06-10T07:00:00Z';
String res = '/file/<accountName>/<folderName>/test.txt';
String si = '';
String sip = '';
String spr = '';
String sr = 'f';
String sv = '2017-11-09';
String rscc = '';
String rscd = '';
String rsce = '';
String rscl = '';
String rsct = '';

String sts = spe + '\n'  +
    st + '\n' +
    se + '\n' +
    res + '\n' +
    si + '\n' +
    sip + '\n' +
    spr + '\n'+
    sv + '\n' +
    rscc + '\n' +
    rscd + '\n' +
    rsce + '\n' +
    rscl + '\n' +
    rsct;

Blob data = crypto.generateMac('HmacSHA256', Blob.valueOf(sts), EncodingUtil.base64Decode(key));
String sas = EncodingUtil.base64Encode(data);
sas = EncodingUtil.urlEncode(sas, 'UTF-8');
link += '?sv=' + sv + '&se=' + se + '&sr=' + sr + '&sp=' + spe + '&sig=' + sas;
System.debug(link);
0 голосов
/ 08 июня 2018

Как упомянуто в сообщении об ошибке, похоже, что это связано с проблемой аутентификации, я рекомендую посетить следующие две ссылки: https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-an-account-sas

и https://zimmergren.net/azure-storage-rest-api-authenticate-with-c/, чтобы проверить правильностьвашего заголовка аутентификации:

an example of an account SAS:

https://storagesample.blob.core.windows.net/sample-container?restype=container&comp=metadata&sv=2015-04-05ss=bfqt&srt=sco&sp=rl&se=2015-09-20T08:49Z&sip=168.1.5.60-168.1.5.70&sig=a39%2BYozJhGp6miujGymjRpN8tsrQfLo9Z3i8IRyIpnQ%3d
...