powershell - PowerShell 中的 IoT 中心共享访问签名
问题描述
如何使用 PowerShell 创建 IoT 中心共享访问签名。我的代码在使用 Azure IoT Explorer 中生成的签名时有效。假设签名生成有问题:
$Uri = "$IotHubName.azure-devices.net/devices/$IotDeviceId"
$Expiry = [string](([DateTimeOffset]::Now.ToUnixTimeSeconds())+3600)
$IotHubKeyDecoded = [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($IotHubKey))
$StringToSign = [System.Web.HttpUtility]::UrlEncode($Uri) + "`n" + $Expiry
$Hmacsha = New-Object System.Security.Cryptography.HMACSHA256
$Hmacsha.key = [Text.Encoding]::ASCII.GetBytes($IotHubKeyDecoded)
$Signature = $Hmacsha.ComputeHash([Text.Encoding]::ASCII.GetBytes($StringToSign))
$Signature = [System.Web.HttpUtility]::UrlEncode([Convert]::ToBase64String($Signature))
我尝试使用 New-AzIotHubSasToken 但得到“未经授权”:
$SharedAccessSignature = New-AzIotHubSasToken -ResourceGroupName $IotHub.ResourceGroupName -IotHubName $IotHubName -DeviceId $IotDeviceId
$Headers = @{"Authorization" = $SharedAccessSignature; "Content-Type"="application/json";}
$Uri = "https://$IotHubName.azure-devices.net/devices/$IotDeviceId/messages/events?api-version=2020-03-13"
Invoke-RestMethod -Uri $Uri -Headers $Headers -Method Post -Body $JsonBody
解决方案
我不确定您为什么要尝试以这种方式创建 SAS 令牌,但您可以为此目的使用 PowerShell 或 Azure CLI(您必须先安装它)。
这里有两个例子:
# PowerShell
New-AzIotHubSasToken -IotHubName "{IoT Hub Name}" -DeviceId "{Device Id}" -ResourceGroupName "{Resource Group Name}"
# Output
SharedAccessSignature sr={IoT Hub Name}.azure-devices.net%2fdevices%2f{Device Id}&sig=iuhiAfagvhgd3QtqjukX8upPuWj%2fuJuYn%2bJgeOe6Uwo%3d&se=1604085022
# Azure CLI
az iot hub generate-sas-token -n {IoT Hub Name} -d {Device Id}
# Output
{
"sas": "SharedAccessSignature sr={IoT Hub Name}.azure-devices.net%2fdevices%2f{Device Id}&sig=iuhiAfagvhgd3QtqjukX8upPuWj%2fuJuYn%2bJgeOe6Uwo%3d&se=1604085022"
}
请记住,您必须先登录然后选择相应的订阅(如果您有多个订阅)
az login
# Optionally: az account list
az account set --subscription {subscription id}
推荐阅读
- python - python中具有大量数字的指数函数
- python - 从源代码文件匹配正则表达式并保存到列表/数据框
- python - 如果在电子邮件主题中找到多个部分字符串,则将电子邮件移至文件夹
- python - 如何在数据框中添加以下自定义列?
- apache-spark - Delta Lake 增量清单文件生成
- python - django 返回 NoReverseMatch 但它实际上得到了值
- javascript - 用光标悬停时更改背景颜色
- android - 发现名称冲突的 getter
- r - 如何在 blogdown 帖子的标题中包含图像
- javascript - 通过当前日期时间的开始和结束日期时间更改全日历事件颜色