在Postman中为Azure通知中心创建注册

时间:2015-08-13 12:25:39

标签: api rest postman azure-notificationhub

我在Azure门户中创建了一个服务总线/通知中心。

现在我正在尝试使用基于此doc的 Postman 的Azure REST API: https://msdn.microsoft.com/en-us/library/azure/dn223265.aspx

这是我的Postman配置:

以下网址的 POST 方法(创建注册https://mysite.servicebus.windows.net/mysite-notif/registrations/?api-version=2015-01 (出于隐私原因,我在该网址中替换为 mysite

标题中,我输入了2个条目:

内容型 应用/原子+ xml的;类型=项;字符集= UTF-8

授权 端点= SB:// [mysite的] .servicebus.windows.net /; SharedAccessKeyName = DefaultFullSharedAccessSignature; SharedAccessKey = [的myKey] (我从Azure门户复制的此连接信息)

正文中,我选择 raw - XML(txt / xml)并粘贴:

<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">
    <content type="application/xml">
        <WindowsRegistrationDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect">
            <Tags>myTag, myOtherTag</Tags>
            <ChannelUri>{ChannelUri}</ChannelUri>
        </WindowsRegistrationDescription>
    </content>
</entry>

(这是Windows Notification Service示例的本机注册)

当我从邮递员发送此电话时,我收到 401错误

<Error>
    <Code>401</Code>
    <Detail>MalformedToken: The credentials contained in the authorization header are not in the WRAP format..TrackingId:ee0d87ef-6175-46a1-9b35-6c31eed6049d_G2,TimeStamp:8/13/2015 9:58:26 AM</Detail>
</Error>

我错过了什么? 这是我留在邮递员“No Auth”的授权标签吗? 它是应该如此处所示编码的Authorization标头的值吗? Creating registration ID for Azure Notification Hub via REST api

感谢。

9 个答案:

答案 0 :(得分:6)

您的“授权”标题不正确。

Azure Notification Hubs REST API documentation, e.g. for creating a registration中所述,“授权”标头必须包含“按照使用服务总线的共享访问签名身份验证中指定生成的令牌” ...

令牌格式在Shared Access Signature Authentication with Service Bus的文档中指定,如下所示:

SharedAccessSignature sig=<signature-string>&se=<expiry>&skn=<keyName>&sr=<URL-encoded-resourceURI>
  • URL-encoded-resourceURI:您发送POST请求的网址(在您的情况下为“https://mysite.servicebus.windows.net/mysite-notif/registrations/?api-version=2015-01”)
  • keyName:在您的情况下,默认密钥名称“DefaultFullSharedAccessSignature”
  • expiry:到期日表示为自1970年1月1日世界00:00:00 UTC以来的秒数。
  • signature-string:使用具有授权规则的PrimaryKey属性的字符串到符号的HMAC-SHA256计算SAS令牌的签名。字符串到符号由资源URI和到期时间组成,格式如下:
    • StringToSign = <resourceURI> + "\n" + expiry;
    • resourceURI应与URL-encoded-resourceURI(也是网址编码)
    • 相同
    • 使用SAS密钥(在您的示例中替换为[mykey])计算StringToSign的HMAC-SHA256。然后使用signature-string的URL编码结果。

答案 1 :(得分:4)

以下是生成所需标头的邮递员请求前脚本的示例:

function getAuthHeader(resourceUri, keyName, key) {

    var d = new Date();
    var sinceEpoch = Math.round(d.getTime() / 1000);

    var expiry = (sinceEpoch + 3600);

    var stringToSign = encodeURIComponent(resourceUri) + '\n' + expiry;

    var hash = CryptoJS.HmacSHA256(stringToSign, key);
    var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);

    var sasToken = 'SharedAccessSignature sr=' + encodeURIComponent(resourceUri) + '&sig=' + encodeURIComponent(hashInBase64) + '&se=' + expiry + '&skn=' + keyName;

    return sasToken;
}

postman.setEnvironmentVariable('azure-authorization', getAuthHeader(request['url'], "mySharedAccessKeyName", "mySharedAccessKey"));
postman.setEnvironmentVariable('current-date',new Date().toUTCString());

要使用它,请执行以下操作:

  1. 将此预请求脚本添加到邮递员请求
  2. 使用您的凭据替换mySharedAccessKeyNamemySharedAccessKey
  3. 添加标题Authorization: {{azure-authorization}}
  4. 添加标题x-ms-date: {{current-date}}

答案 2 :(得分:2)

花了一个多小时试图理解为什么上面的步骤不起作用,我意识到你是否正在使用https://code.msdn.microsoft.com/Shared-Access-Signature-0a88adf8中的代码它有两个未在代码顶部定义的东西。键和KeyName。

钥匙是我提到的部分,因为乍一看这里的另一篇文章我觉得它是一样的。不是。

在Azure中:转到您的通知中心,然后点击&gt;设置&gt;然后在具有“管理权限”的策略上访问策略。如果需要,请添加策略。单击“访问策略”后。它显示连接字符串,主要和辅助。将主节点复制到剪贴板并将其扔到记事本中。它看起来像这样..

  

端点= SB://mysite.servicebus.windows.net/; SharedAccessKeyName = DefaultFullSharedAccessSignature; SharedAccessKey = hc7qZ + pMG6zltjmASDFrskZO + Yv52D55KQUxUTSO0og =

SharedAccessKeyName = KeyName

SharedAccessKey = Key

是的,所有拼写在这里看起来很明显,但除非你复制,否则你无法在AZURE门户网站上看到这些信息。

所以,为了完全清楚,在标题中你会生成关键字&#34; sig&#34;通过组合+&#34; \ n&#34; Baris确实指出了+到期,但是你用Key而不是KeyName来签名..

我可能听起来像是一个白痴拼写出来但这个过程并不容易。

希望它可以帮助别人。

答案 3 :(得分:0)

与Jérôme一样,我也使用https://code.msdn.microsoft.com/Shared-Access-Signature-0a88adf8处的示例生成令牌,我还发现.NET生成的令牌有效。我将.NET生成的令牌与我的ruby生成的令牌进行了比较,发现URI.escape没有编码我的base64哈希的最后一个字符('='符号)。它也没有编码'+'符号。在函数中添加字符串'= +'修复了问题: URI.escape(hmacb64,'= +') (我不知道这里是否还有其他字符需要识别。)

答案 4 :(得分:0)

Baris Akar的回答大多是正确的,除了一个遗漏,无论出于何种原因,relevant documentation中也没有提到:签名参数(即sig中的签名字符串=)必须是Base64编码!

答案 5 :(得分:0)

你必须删除&#34; \&#34;&#34;在令牌字符串中,如下所示。

authorizationString = resultA.replaceAll(&#34; \&#34;&#34;,&#34;&#34;);

从 &#34; SharedAccessSignature sr = https%3a%2f%2fmshub.servicebus.windows.net%2f&amp; sig = PFZVab43PMsO0q9gz4%2bFsuaQq%5ff05L4M7hKVBN8DEn0%3d&amp; se = 1553339810&amp; skn = RootManageSharedAccessKey&#34;

要 SharedAccessSignature sr = https%3a%2f%2fmshub.servicebus.windows.net%2f&amp; sig = PFZVab43PMsO0q9gz4%2bFsuaQq%5ff05L4M7hKVBN8DEn0%3d&amp; se = 1553339810&amp; skn = RootManageSharedAccessKey

祝你好运。

答案 6 :(得分:0)

我还花了很多时间才想出一种在Go中生成SAS令牌的方法。

我创建了一个摘要,说明了如何生成这些令牌: https://gist.github.com/dennis-tra/14c63e6359f17cbb504e78d6740ca465

如果没有找到这个仓库,我可能不会想出来: https://github.com/shanepeckham/GenerateSASTokenGo/blob/master/gosas.go

答案 7 :(得分:0)

Dirk提供的解决方案帮助我解决了该问题。 但是请确保使用具有“管理”声明访问权限的策略中的SharedAccessKeyName和SharedAccessKey。如果只有“发送”和/或“监听”声明,则身份验证将不起作用,并会引发错误-MalformedToken:授权标头中包含的凭据不是WRAP格式

答案 8 :(得分:0)

请参阅 Microsoft 提供的以下文档以生成 SAS 令牌。 您可以在 Postman 中使用此令牌。

Generate SAS Token (NodeJs, Java, etc.)