我在Azure门户中创建了一个服务总线/通知中心。
现在,我尝试在Postman中使用Azure,基于这个文档:https://msdn.microsoft.com/en-us/library/azure/dn223265.aspx
下面是我的邮递员配置:
它是下面的url (创建注册)方法(出于隐私原因,我在该url中替换了mysite )
在Header中,我输入了2个条目:
内容-类型为应用程序/atom+xml;type=entry;charset=utf-8
Authorization Endpoint=sb://mysite.servicebus.windows.net/;SharedAccessKeyName=DefaultFullSharedAccessSignature;SharedAccessKey=麦基
在Body中,我选择了raw -(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示例的本机注册)
当我从邮递员内部发送这个电话时,我得到一个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>我错过了什么?是我在邮递员的“禁止八月”上留下的授权标签吗?授权头的值应该像这里所示的那样编码吗?通过REST为Azure通知中心创建注册ID
谢谢。
发布于 2015-08-14 15:25:17
您的"Authorization"头不正确。
如"Authorization"中所述,Azure通知集线器REST文档,例如用于创建注册报头必须包含“服务总线共享访问签名身份验证中指定的令牌”.
基于服务总线的共享访问签名认证的文档中将令牌格式指定为:
SharedAccessSignature sig=<signature-string>&se=<expiry>&skn=<keyName>&sr=<URL-encoded-resourceURI>URL-encoded-resourceURI:您发送POST请求的url (在您的例子中是"https://mysite.servicebus.windows.net/mysite-notif/registrations/?api-version=2015-01")keyName:在您的示例中,默认密钥名为"DefaultFullSharedAccessSignature“expiry:过期时间表示为1970年1月1日协调世界时00时起的秒数。signature-string:使用带有授权规则的PrimaryKey属性的字符串到签名的HMAC- The 256计算SAS令牌的签名。字符串到符号由一个资源URI和一个到期组成,格式如下:StringToSign = <resourceURI> + "\n" + expiry;resourceURI应该与URL-encoded-resourceURI相同(也是URL-encoded-resourceURI编码的)StringToSign的HMAC- the 256(示例中用mykey替换的内容)。然后,为signature-string使用URL编码结果。
发布于 2018-05-15 06:02:42
下面是一个用于postman的预请求脚本的示例,该脚本生成所需的标头:
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());若要使用它,请执行以下操作:
mySharedAccessKeyName、mySharedAccessKeyAuthorization: {{azure-authorization}}x-ms-date: {{current-date}}发布于 2016-10-03 20:34:02
在花了一个多小时试图理解为什么上面的步骤不起作用之后,我意识到如果您使用的是来自https://code.msdn.microsoft.com/Shared-Access-Signature-0a88adf8的代码,它有两件事情没有在代码的顶部定义。Key和KeyName。
关键是暗示我的部分,因为乍一看这里的另一篇文章我认为是一样的。不是的。
在Azure中:转到Notification,然后单击> Settings>访问策略,然后单击具有管理权限的策略。如果需要,请添加策略。一旦您单击访问策略。它显示连接字符串,主字符串和辅助字符串。将主版复制到剪贴板并将其扔到记事本中。看起来会像这样..。
Endpoint=sb://mysite.servicebus.windows.net/;SharedAccessKeyName=DefaultFullSharedAccessSignature;SharedAccessKey=hc7qZ+pMG6zltjmASDFrskZO+Yv52D55KQUxUTSO0og=
SharedAccessKeyName = KeyName
SharedAccessKey = Key
是的,它看起来很明显,在这里所有的拼写,但你不能看到这个信息在AZURE门户,除非你复制。
因此,为了完全清楚,在标题中,通过组合+ "\n“+到期来生成键"sig”,这是Baris指出的,但是您用键(而不是KeyName)签名。
我可能听起来像个白痴,把这个拼出来,但这个过程并不容易。
希望它能帮到别人。
https://stackoverflow.com/questions/31988204
复制相似问题