2015-08-13 47 views
2

我在Azure门户中创建了服务总线/通知中心。在Postman中为Azure通知中心创建注册

现在我试图用邮差使用Azure的REST API基于这个文档: https://msdn.microsoft.com/en-us/library/azure/dn223265.aspx

这里是邮差配置我:

它的一个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门户复制的连接信息)

身体,我选择了原料 - 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通知服务例如本地注册)

当我把这个电话从内部邮差,我得到一个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> 

我缺少什么? 它是我留在邮差中的“不认证”的授权标签吗? 它应该如此处所示进行编码的授权标头的值是什么? Creating registration ID for Azure Notification Hub via REST api

谢谢。

回答

3

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

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:到期时间表示为自纪元以来的秒数00:00:00 UT C
  • signature-string:SAS令牌的签名是使用带有授权规则的PrimaryKey属性的字符串到符号的HMAC-SHA256来计算的。的字符串到符号由一个资源URI和到期的,格式如下:
    • StringToSign = <resourceURI> + "\n" + expiry;
    • resourceURI应该是相同的URL-encoded-resourceURI(也URL编码)
    • 计算的StringToSign HMAC-SHA256使用SAS密钥(在你的例子中你用[mykey]代替)。然后使用signature-string的URL编码结果。
+0

我用了你的信息来纠正我的代码(这是Java脚本在Adobe系列/ Neolane) 我得到一个401“HTTP头‘WWW验证’用于未找到代理验证。” 获得构建SharedAccessSignature 4个参数是: 1)signatureString:201970e7eaec1c11764c29185575e051a5b447fc63256b319e5bb624677fd8cb - 2)届满:1441035401.512 - 3)的keyName:DefaultFullSharedAccessSignature - 4)URL编码-resourceURI:HTTPS://mysite-ns.servicebus .windows.net/mysite/registrations /?api-version = 2015-01 它看起来是否正确? (显然不是) –

+0

修复显示完整的url:URL-encoded-resourceURI:https:// mysite-ns.servicebus.windows.net/mysite/registrations/?api-version=2015-01(w/o内部空间) –

+0

1.'expiry'应该是一个整数(你有一个点)。 2.你的URI不是URL编码的(应该是这样的:'https%3A%2F%2Fmysite-ns.servicebus.windows.net%2Fmysite%2Fregistrations%2F%3Fapi-version%3D2015-01')。 3.关于你得到的错误:看来你有一些代理配置,我不知道如何工作,但看看[这个问题](http://stackoverflow.com/questions/1748374/http-401 -whats-AN-适当-WWW验证报头值)。 –

0

像杰罗姆,我也使用的示例在https://code.msdn.microsoft.com/Shared-Access-Signature-0a88adf8生成令牌,我也发现,在.NET生成的令牌的工作。我将.NET生成的令牌与ruby生成的令牌进行比较,发现URI.escape没有编码我的base64散列的最后一个字符('='符号)。它也没有编码'+'符号。添加字符串“= +”的功能解决了这一问题:URI.escape(hmacb64,“= +”) (我不知道是否有应该在这里确定的其他字符。)

1

在花了一个多小时试图理解为什么上述步骤不起作用之后,我意识到如果您使用的代码来自https://code.msdn.microsoft.com/Shared-Access-Signature-0a88adf8它有两件事情没有在代码的顶部定义。 Key和KeyName。

关键是暗示我的部分,因为乍一看这里的另一篇文章,我认为它是一样的。不是。

在Azure中:转到您的通知中心,然后单击>设置>访问策略,然后在具有管理权限的策略上。如果需要,请添加一项政策。一旦你点击访问策略。它显示连接字符串,主要和次要。将主文件复制到您的剪贴板并将其放入记事本中。它会是这个样子..

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

SharedAccessKeyName =键名

SharedAccessKey =关键

是啊,它看起来明显的拼写都在这里,但你不能看到AZURE门户网站这个信息,除非你把它复制。

所以只需要完全清楚,在标题中,您通过结合Baris指出的“\ n”+过期来生成密钥“sig”,但随后您使用密钥而不是密钥名称对其进行签名。

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

希望它可以帮助别人。

+0

哦,上帝,我是个白痴。这次真是万分感谢。我使用了错误的钥匙。 –

相关问题