生成aeg-sas-token的密钥是什么?EventGrid示例代码未指明有效密钥
生成AEG-SAS-Token的核心要点及密钥定位问题
我之前在调试Event Grid的SAS令牌时也踩过一模一样的坑,特别理解你找不到正确密钥、用了访问密钥却无效的困惑。下面给你拆解关键要点和可能的问题:
生成AEG-SAS-Token的核心关键
- 必须使用对应Event Grid主题/域的访问密钥:这是最核心的前提,AEG-SAS-Token不通用其他Azure服务的密钥,甚至不能用Event Grid命名空间的密钥,必须是你要推送事件的具体主题/域的访问密钥(密钥1或密钥2都可以)。
- 精确匹配资源URI:签名时的资源URI必须是主题的完整端点(比如
https://<your-topic-name>.eastus.eventgrid.azure.net/api/events),路径、区域、名称都不能错,而且要做URL编码后再参与签名。 - 完整的令牌参数:生成的令牌必须包含四个核心参数:
sr:编码后的主题端点sig:HMAC-SHA256算法生成的签名se:UTC时区的Unix过期时间戳(秒)skn:你使用的密钥名称(key1或key2),这个参数很容易被忽略,但少了它服务端会无法验证签名。
为什么你用Event Grid访问密钥无效?
大概率是这几个细节没做对:
- 用错了密钥来源:别去Event Grid命名空间或者其他关联服务里找密钥,要直接进入你目标主题的Azure门户页面,在“访问密钥”选项卡下复制密钥1或密钥2。
- 资源URI不完整:很多人会省略端点的
/api/events路径,或者写错区域/主题名称,这会导致签名不匹配,令牌直接失效。 - 遗漏了
skn参数:官方示例里可能有些场景没明确写这个参数,但实际使用时必须加上,否则服务端不知道你用的是哪个密钥进行签名,自然验证失败。
快速验证的示例(PowerShell)
给你一个能直接跑的示例,替换成你的主题信息就能生成有效令牌:
# 替换成你的主题端点和访问密钥 $topicEndpoint = "https://your-topic-name.eastus.eventgrid.azure.net/api/events" $accessKey = "your-topic-access-key-here" # 设置令牌1小时后过期 $expirationTime = (Get-Date).AddHours(1).ToUniversalTime() $expirationEpoch = [Math]::Floor((New-TimeSpan -Start (Get-Date "1970-01-01") -End $expirationTime).TotalSeconds) # 生成签名字符串 $encodedEndpoint = [System.Web.HttpUtility]::UrlEncode($topicEndpoint) $stringToSign = $encodedEndpoint + "`n" + $expirationEpoch # 计算HMAC-SHA256签名 $hmac = New-Object System.Security.Cryptography.HMACSHA256 $hmac.Key = [Text.Encoding]::UTF8.GetBytes($accessKey) $signature = [System.Convert]::ToBase64String($hmac.ComputeHash([Text.Encoding]::UTF8.GetBytes($stringToSign))) # 组装完整的SAS令牌 $sasToken = "sr=$encodedEndpoint&sig=$([System.Web.HttpUtility]::UrlEncode($signature))&se=$expirationEpoch&skn=key1"
你可以按照这个逻辑检查你的代码,重点确认密钥来源、URI完整性和skn参数这三个点,应该就能解决问题了。
内容的提问来源于stack exchange,提问作者Yonghe
相关产品推荐
相关产品推荐

