如何通过SAS验证Azure REST API到Service Bus [英] How to authenticate Azure REST APIs to Service Bus with SAS

查看:81
本文介绍了如何通过SAS验证Azure REST API到Service Bus的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用本文档中提供的REST API向Service Bus队列发送消息: https://docs.microsoft.com/en-us/rest/api/servicebus/send-message-to-queue

请注意,我不能使用Azure库来执行此任务,因为据我所知,现在没有可用的服务,并且我正在设置Python中的测试触发器以模拟将从Service Now进行的REST API调用。

我遇到了关于storage queues的类似问题,我尝试重复使用相同的解决方案,但Service Bus将以&Quot;Missing Authorization Header&Quot;作为响应 以下是我的代码,它在标题中使用授权:

import requests
api = f"https://{service_namespace}.servicebus.windows.net/{queue}/messages?"
msg = """<QueueMessage>  
<MessageText>Testing 1234</MessageText>  
</QueueMessage>
"""
header = {
    "Authorization": f"SharedAccessSignature sr=https://{service_namespace}.servicebus.windows.net/{queue}&sig={sig}&se={se}&skn={skn}",
    "Content-Type": "application/atom+xml;type=entry;charset=utf-8"
}
resp = requests.post(api, data=msg, headers=header)
print(resp)
print(resp.text)
print(resp.headers)

这里,sig是我从共享访问策略下的服务总线队列中获得的主键

se是两年后的纪元时间(w/o毫秒) skn是策略的名称

我得到的最终答复是

<Response [401]>

{'Content-Length': '0', 'Server': 'Microsoft-HTTPAPI/2.0', 'Strict-Transport-Security': 'max-age=31536000', 'Date': 'Thu, 24 Feb 2022 09:27:17 GMT'}
如果我在标题中没有使用AUTH而使用上面突出显示的问题中的解决方案, 以下是API结构BTW: f"https://{service_namespace}.servicebus.windows.net/{queue}/messages?sig={sig}&se={se}&skn={skn}" 我收到以下错误:

<Error><Code>401</Code><Detail>MissingToken: The authorization header was not found. To know more visit https://aka.ms/sbResourceMgrExceptions. . TrackingId:<redacted>, SystemTracker:<redacted>.servicebus.windows.net:<redacted>/messages, Timestamp:2022-02-24T09:31:09</Detail></Error>
{'Transfer-Encoding': 'chunked', 'Content-Type': 'application/xml; charset=utf-8', 'Server': 'Microsoft-HTTPAPI/2.0', 'Strict-Transport-Security': 'max-age=31536000', 'Date': 'Thu, 24 Feb 2022 09:31:09 GMT'}

我不确定如何继续,任何提示和建议都将不胜感激。

推荐答案

您收到此错误的原因是您错误地计算了共享访问签名。您可以了解更多信息here

要使用python生成SAS令牌,请参阅以下代码,该代码摘自here

import time
import urllib
import hmac
import hashlib
import base64

def get_auth_token(sb_name, eh_name, sas_name, sas_value):
    """
    Returns an authorization token dictionary 
    for making calls to Event Hubs REST API.
    """
    uri = urllib.parse.quote_plus("https://{}.servicebus.windows.net/{}" 
                                  .format(sb_name, eh_name))
    sas = sas_value.encode('utf-8')
    expiry = str(int(time.time() + 10000))
    string_to_sign = (uri + '
' + expiry).encode('utf-8')
    signed_hmac_sha256 = hmac.HMAC(sas, string_to_sign, hashlib.sha256)
    signature = urllib.parse.quote(base64.b64encode(signed_hmac_sha256.digest()))
    return  {"sb_name": sb_name,
             "eh_name": eh_name,
             "token":'SharedAccessSignature sr={}&sig={}&se={}&skn={}' 
                     .format(uri, signature, expiry, sas_name)
            }

这篇关于如何通过SAS验证Azure REST API到Service Bus的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆