gpt4 book ai didi

rest - 使用 Powershell 和 REST API 添加 Azure 表实体

转载 作者:行者123 更新时间:2023-12-03 00:13:42 25 4
gpt4 key购买 nike

我一直在努力解决一个常见问题:格式化 Azure 表服务 REST API 的授权 header 。我一直无法找到使用 PowerShell 和 SharedKey 的示例,并且担心我在从其他示例逆向工作时犯了一些愚蠢的错误。

具体(尽管不具体)错误是:服务器无法验证请求。确保授权 header 的值格式正确,包括签名。

我一直在引用这些文章以及其他示例:

我已经确认我的 key 是正确的,该表存在,至少有一行,以及许多其他建议,但不幸的是。

如果我应该采取另一种方法来实现相同的目标,我洗耳恭听。我想使用 REST API 来实现客户端的最大兼容性。

$tableEndpoint = 'https://STORAGEACCOUNTNAME.table.core.windows.net/'
$tableName = 'TABLENAME'
$StorageAccountName = 'STORAGEACCOUNTNAME'
$Key = "STORAGEACCOUNTKEY"

Function New-AuthorizationHeader
{
param ($canonicalizedString)

[byte[]]$Bytes = [system.convert]::FromBase64String($Key)
$HMACSHA256 = [System.Security.Cryptography.HMACSHA256]::new($Bytes)
$dataToHmac = [System.Text.Encoding]::UTF8.GetBytes($canonicalizedString)
$Signature = [System.Convert]::ToBase64String($HMACSHA256.ComputeHash($dataToHmac))

[string]$AuthorizationHeader = "{0} {1}:{2}" -f "SharedKey",$StorageAccountName,$Signature

$AuthorizationHeader
}

Function New-Entity
{
param ($jsonContent)

$requestMethod = "POST"
$contentMD5 = [string]::Empty
$storageServiceVersion = '2016-05-31'
$reqDate = (Get-Date -Format r)
$contentType = "application/json"
$canonicalizedResource = "/{0}/{1}" -f $StorageAccountName,($tableEndpoint + $tableName)

$stringToSign = "{0}`n{1}`n{2}`n{3}`n{4}" -f $requestMethod,$contentMD5,$contentType,$reqDate,$canonicalizedResource

$authorizationHeader = New-AuthorizationHeader -canonicalizedString $stringToSign
$content = [System.Text.Encoding]::UTF8.GetBytes($jsonContent)

$fullURI = New-Object -TypeName System.Uri -ArgumentList ($tableEndpoint + $tableName)
$httpWebRequest = [System.Net.WebRequest]::Create($fullURI)
$httpWebRequest.Accept = 'application/json;odata=fullmetadata'
$httpWebRequest.ContentLength = $content.length
$httpWebRequest.ContentType = $contentType
$httpWebRequest.Method = $requestMethod
$httpWebRequest.Headers.Add("x-ms-date", $reqDate)
$httpWebRequest.Headers.Add("x-ms-version", $storageServiceVersion)
$httpWebRequest.Headers.Add("Authorization", $authorizationHeader)
$httpWebRequest.Headers.Add("Accept-Charset", "UTF-8")
$httpWebRequest.Headers.Add("DataServiceVersion", "3.0;NetFx")
$httpWebRequest.Headers.Add("MaxDataServiceVersion", "3.0;NetFx")

$requestStream = $httpWebRequest.GetRequestStream()
$requestStream.Write($content, 0, $content.length)
$requestStream.Close()

$response = $httpWebRequest.GetResponse()
$dataStream = $response.GetResponseStream()

$reader = New-Object -TypeName System.IO.StreamReader($dataStream)

$responseFromServer = $reader.ReadToEnd()
}

$jsonContent = @"
{
"ExecutionStatus"="smapledata",
"PartitionKey"="$ENV:Username",
"RowKey"="PrinterScript"
}
"@

New-Entity -jsonContent $jsonContent

最佳答案

请对上述内容进行 2 项更改:

  1. 规范资源不应具有表端点。所以应该是:

    $canonicalizedResource = "/{0}/{1}"-f $StorageAccountName,$tableName

  2. JSON 正文的格式应正确。所以应该是:

    $jsonContent = @"{ "ExecutionStatus":"smapledata", "PartitionKey":"$ENV:用户名", “RowKey”:“PrinterScript”}“@

完成这些更改后,代码应该可以正常工作。

关于rest - 使用 Powershell 和 REST API 添加 Azure 表实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42792430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com