如何在 Postman 中创建 SAS 令牌以与服务总线一起使用?

How to create SAS token in Postman to use with Service bus?

基于此 Microsoft 文档: https://docs.microsoft.com/en-us/rest/api/eventhub/generate-sas-token

nodejs 的代码是:

function createSharedAccessToken(uri, saName, saKey) { 
if (!uri || !saName || !saKey) { 
        throw "Missing required parameter"; 
    } 
var encoded = encodeURIComponent(uri); 
var now = new Date(); 
var week = 60*60*24*7;
var ttl = Math.round(now.getTime() / 1000) + week;
var signature = encoded + '\n' + ttl; 
var signatureUTF8 = utf8.encode(signature); 
var hash = crypto.createHmac('sha256', saKey).update(signatureUTF8).digest('base64'); 
return 'SharedAccessSignature sr=' + encoded + '&sig=' +  
    encodeURIComponent(hash) + '&se=' + ttl + '&skn=' + saName; 
 }

我在 Postman 上尝试过,以防有人需要帮助。这是使用 Postman

在预请求脚本下对我有用的代码
var namespace = pm.collectionVariables.get("serviceNamespace");
var uri = "https://" + namespace + ".servicebus.windows.net/adfTest/messages";
var saName = pm.collectionVariables.get("SharedAccessKeyName");
var saKey = pm.collectionVariables.get("SharedAccessKeySend");

var sasToken = createSharedAccessToken(uri, saName, saKey);

console.log(sasToken);
pm.collectionVariables.set("SasToken", sasToken);

function createSharedAccessToken(uri, saName, saKey) { 
    if (!uri || !saName || !saKey) { 
            throw "Missing required parameter"; 
        } 
    var encoded = encodeURIComponent(uri).toLowerCase(); 
    var now = new Date(); 
    var week = 60*60*24*7;
    var ttl = Math.round(now.getTime() / 1000) + week;
    var signature = encoded + '\n' + ttl;     
    var hash = CryptoJS.HmacSHA256(signature, saKey);
    var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
    return 'SharedAccessSignature sr=' + encoded + '&sig=' +  
        encodeURIComponent(hashInBase64) + '&se=' + ttl + '&skn=' + saName; 
}
  1. 在您 collection 下创建变量:

从 Azure 门户获取值 - 服务总线 服务命名空间、SharedAccessKey、SharedAccessKeyName

  1. 添加Pre-request脚本下的代码

    var namespace =      pm.collectionVariables.get("serviceNamespace");
    var uri = "https://" + namespace + ".servicebus.windows.net/adfTest/messages";
    var saName = pm.collectionVariables.get("SharedAccessKeyName");
    var saKey = pm.collectionVariables.get("SharedAccessKeySend");
    
    var sasToken = createSharedAccessToken(uri, saName, saKey);
    
    console.log(sasToken);
    pm.collectionVariables.set("SasToken", sasToken);
    
    function createSharedAccessToken(uri, saName, saKey) { 
        if (!uri || !saName || !saKey) { 
                throw "Missing required parameter"; 
            } 
        var encoded = encodeURIComponent(uri).toLowerCase(); 
        var now = new Date(); 
        var week = 60*60*24*7;
        var ttl = Math.round(now.getTime() / 1000) + week;
        var signature = encoded + '\n' + ttl;     
        var hash = CryptoJS.HmacSHA256(signature, saKey);
        var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
        return 'SharedAccessSignature sr=' + encoded + '&sig=' +  
            encodeURIComponent(hashInBase64) + '&se=' + ttl + '&skn=' + saName; 
    }
    

注意adfTest部分为主题名称,请替换为您的主题名称

var uri = "https://" + namespace + ".servicebus.windows.net/adfTest/messages";
  • 在授权下使用 sasToken 变量:

  • Select API 下拉菜单中的键。

  • 密钥=授权

  • Value = {{SasToken}} <-- 这是变量名

  • 加=Header

  1. 创建 post:

这些是 post

的要求
     POST https://<yournamespace>.servicebus.windows.net/<yourentity>/messages
    Content-Type: application/json
    Authorization: SharedAccessSignature sr=https%3A%2F%2F<yournamespace>.servicebus.windows.net%2F<yourentity>&sig=<yoursignature from code above>&se=1438205742&skn=KeyName
    ContentType: application/atom+xml;type=entry;charset=utf-8

URL 应该是这样的: https://.servicebus.windows.net//消息

在授权下从 parent 继承授权:

这将使用 pre-request 脚本在 collection

下生成的 SAS 令牌添加授权 header

添加其他 header:

  1. 将消息放入 body:

这可以是任何 json 数据