2016-02-12 4 views
1

Я пытаюсь сделать REST-вызов на моей Azure Table с помощью javascript, но мне трудно аутентифицировать вызов.Azure Table Storage Authenticate REST вызов через javascript

Я использую этот кусок JavaScript (я знаю, что дата должна быть не более 15 мин назад, и я не планирую использовать действующий ключ в JavaScript!)

$(document).ready(function(){ 
    $("button").click(function(){ 
     var dateTimeInUtc = 'Fri, 12 Feb 2016 12:14:00 GMT'; 
     var version = '2015-04-05'; 
     var key = 'JEwMjqFD1ng8vIaECmRw8eQysiIvH08nF/jPKPYaNGumgxtKIjltX8bte5sKN6SNyw09s=='; // not an actuall key 
     var stringToSign = 'GET\n\n\nFri, 12 Feb 2016 12:14:00 GMT\n/myaccount/mytable(PartitionKey=\'first_partition\', RowKey=\'1235\')'; 
     var signature = CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA256(CryptoJS.enc.Utf8.parse(stringToSign), CryptoJS.enc.Base64.parse(key))); 
     $.ajax({ 
      url:'https://myaccount.table.core.windows.net/mytable(PartitionKey=\'first_partition\', RowKey=\'1235\')', 
      type: 'GET', 
      success: function (data) { 
       console.log('well done'); 
      }, 
      beforeSend: function (xhr) { 
       xhr.setRequestHeader('Authorization', "SharedKey " + "myaccount" + ":" + signature); 
       xhr.setRequestHeader('x-ms-date', dateTimeInUtc); 
       xhr.setRequestHeader('x-ms-version', version); 
      }, 
      error: function (rcvData) { 
       console.log(rcvData); 
      } 
     }); 
    }); 
}); 

что я получаю

403 (Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.) 

Вы видите что-то явно неправильное? Я что-то пропустил от подписи?

+0

Мне любопытно узнать, правильно ли установлен CORS? –

+0

Я установил его через http://www.cloudportam.com/ в конце концов, потому что python sdk не предлагает эту функциональность [пока] (http://stackoverflow.com/questions/35342136/how-to-set-the -properties-оф-ан-лазурь стол-через-питон-SDK). Для пропущения части конфигурации на данный момент я просто добавил правило дополнительного корса, похожее на значение по умолчанию, которое использует cloudportam, и я добавил свое происхождение. Таким образом, все действия разрешены, разрешены и выставлены заголовки установлены на * и максимальный возраст 500. – LetsPlayYahtzee

+0

Ответы об ошибке могут включать в себя тело, которое сообщит вам строку в знак, что служба ожидает. Вы можете использовать это для отладки строки в знак. Кроме того, взгляните на реализацию библиотеки .NET: https://github.com/Azure/azure-storage-net/blob/master/Lib/ClassLibraryCommon/Core/Auth/SharedKeyTableCanonicalizer.cs#L72 –

ответ

1

Строка к знаку, который вы построить должен быть точный URL передается по проводам, в том числе процентов кодирования символов, не разрешенных в URL. В этом случае символ пробела в URL-адресе будет закодирован в процентах по проводу, поэтому он должен быть закодирован в строке в знак.

От MSDN page:

Любая часть CanonicalizedResource строки, который является производным от URI ресурса должен быть закодирован именно так, как это в URI.

+0

Фактически удаление пространства как с URL-адреса, так и с помощью строки-знака заставило его работать – LetsPlayYahtzee

0

Основываясь на documentation for creating authorization header, чтобы создать строку подписать:

  1. Начиная с пустой строкой («»), добавьте косую черту (/), а затем имя учетной записи, принадлежит ресурс .
  2. Добавить кодированный путь URI ресурса без каких-либо параметров запроса.
  3. Добавить имя новой строки (\ n) после имени ресурса.

Однако в вашем коде, вы не включая (PartitionKey=\'first_partition\', RowKey=\'1235\') там, которые должны быть включены.

Вы можете попробовать что-то вроде следующего:

var stringToSign = 'GET\n\n\nFri, 12 Feb 2016 12:14:00 GMT\n/htirawdata/htirawdata(PartitionKey=\'first_partition\', RowKey=\'1235\')'; 
+0

К сожалению. Я забыл удалить настоящее имя из этой строки! – LetsPlayYahtzee

+0

То, что вы предположили, вероятно, правильно, но я все равно получаю тот же результат:/ – LetsPlayYahtzee

+0

Попробуйте положить новый символ строки в конец stringToSign. –

Смежные вопросы