事件中心API POST:40103:无效的授权令牌签名

时间:2019-11-12 14:05:30

标签: azure azureservicebus azure-eventhub sas-token

在将其标记为重复之前:我已经阅读了上面错误消息中关于SO的每个问题/答案,但是没有一个问题/答案能够解决我的问题。我一定想念一些简单的东西,因为简单的东西行不通。

我创建了一个事件中心命名空间,在命名空间中带有一个“发送”共享访问策略和一个事件中心。

使用Python Event Hub SDK(原为suggested in another answer)中的代码,我使用以下脚本创建我的Authorization标头:

import time
from base64 import b64encode, b64decode
from hashlib import sha256
from hmac import HMAC
from urllib.parse import quote_plus, urlencode

def generate_sas_token(uri, policy, policy_key, expiry_days=14):
    expiry = time.time() + expiry_days * 60 * 60 * 24
    encoded_uri = quote_plus(uri)
    ttl = int(expiry)
    sign_key = '{}\n{}'.format(encoded_uri, ttl)
    signature = b64encode(HMAC(b64decode(policy_key), sign_key.encode('utf-8'), sha256).digest())
    result = {
        'sr': uri,
        'sig': signature,
        'se': str(ttl),
        'skn': policy
    }
    return 'SharedAccessSignature ' + urlencode(result)

if __name__ == '__main__':
    NAMESPACE = input('Namespace: ').strip().lower()
    URI = '{}.servicebus.windows.net'.format(NAMESPACE)
    POLICY = input('Policy: ').strip()
    POLICY_KEY = input('Policy key: ').strip()
    EXPIRY_DAYS = int(input('Expiry (days): ').strip())
    print(generate_sas_token(URI, POLICY, POLICY_KEY, EXPIRY_DAYS))

现在,如果我使用以下(虚拟)值运行此脚本:

NAMESPACE=<my Event Hub Namespace> # let's call it "ehns"
POLICY=<"Send" Shared Access Policy Name> # let's call it "event-publisher"
POLICY_KEY=<Primary Key for the above policy, ends with = sign>
EXPIRY_DAYS=14

然后我得到以下(虚拟)Authorization标头:

SharedAccessSignature sr=ehns.servicebus.windows.net&sig=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%3D&se=1574773874&skn=event-publisher

现在,当我向API端点following this page发布虚拟消息时:

curl -i -X POST --data-ascii "test message" -H "Content-Type: text/plain" -H "Authorization: SharedAccessSignature sr=ehns.servicebus.windows.net&sig=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%3D&se=1574773874&skn=event-publisher" https://ehns.servicebus.windows.net/ehresource/messages

我收到以下答复:

HTTP/1.1 401 SubCode=40103: Invalid authorization token signature
Content-Length: 0
Server: Microsoft-HTTPAPI/2.0
Strict-Transport-Security: max-age=31536000
Date: Tue, 12 Nov 2019 13:11:34 GMT

注意:

  • 我还尝试了使用this page上的shell命令(通过问题/答案之一链接到该命令)生成共享访问签名,但无济于事。
  • 我也尝试过Event Hubs Signature Generator,但没有成功。

1 个答案:

答案 0 :(得分:1)

请使用以下代码:

setState()

测试结果:

enter image description here