我正在尝试通过coldfusion连接Azure DocumentDB / CosmosDB,但收到401授权错误。我已经安装了证书,但仍然遇到同样的问题。我尝试使用PHP,Nodejs,两者都表现良好,除了ColdFusion。也尝试使用coldfusion脚本,但错误保持不变。这是我写的代码:
<cfset x_ms_date="#GetHttpTimeString(now())#"/>
<cfset br = "#chr(13)##chr(10)#">
<cfset signStr="GET#br#dbs#br##br##x_ms_date##br##br#" />
<cfset strBase64ValueKey="BASE64_ENCODED_MASTER_KEY" />
<cfset key=ToString(ToBinary(strBase64ValueKey))/>
<cfset x=ToBase64(hmac(LCase(signStr),LCase(key),"HMACSHA256"))>
<cfhttp method="GET" url="https://APP_URL.documents.azure.com/dbs" throwonerror="Yes">
<cfhttpparam name="Authorization" type="header" value="#URLEncodedFormat("type=master&ver=1.0&sig="&x)#">
<cfhttpparam name="x-ms-date" type="header" value="#x_ms_date#">
<cfhttpparam name="x-ms-version" type="header" value="2017-02-22">
</cfhttp>
<cfoutput>
#cfhttp.fileContent#
</cfoutput>
以下是上述代码的回复:
{&#34;代码&#34;:&#34;未经授权&#34;,&#34;消息&#34;:&#34;输入授权令牌无法使用 满足要求。请检查预期的有效负载是否构建为 根据协议,检查正在使用的密钥。服务器使用了 跟随有效负载签署:&#39; get \ ndbs \ n \ nthu,08 feb 2018 19:52:03 gmt \ n \ n&#39; \ r \ nActivityId:aab94428-63a0-4eb7-807b-SOMETHING, Microsoft.Azure.Documents.Common / 1.20.186.1&#34;}
该代码有什么问题?提前致谢
答案 0 :(得分:2)
如果您将代码更改为以下内容,则可以使用此功能:
<cfset x_ms_date = GetHttpTimeString(now()) />
<cfset strBase64ValueKey = "BASE64_ENCODED_MASTER_KEY" />
<cfset br = chr(10)>
<cfset signStr = "GET#br#dbs#br##br##x_ms_date##br##br#" />
<cfset secret = createObject('java', 'javax.crypto.spec.SecretKeySpec' ).Init(BinaryDecode(strBase64ValueKey, "Base64"), 'HmacSHA256')/>
<cfset mac = createObject('java', "javax.crypto.Mac")/>
<cfset mac = mac.getInstance("HmacSHA256")/>
<cfset mac.init(secret)/>
<cfset x = mac.doFinal(LCase(signStr).GetBytes())>
<cfset sig = BinaryEncode(x, "Base64")>
<cfset token = URLEncodedFormat("type=master&ver=1.0&sig=#sig#")>
<cfhttp method="GET" url="https://APP_URL.documents.azure.com/dbs" throwonerror="Yes">
<cfhttpparam name="Authorization" type="header" value="#token#">
<cfhttpparam name="x-ms-date" type="header" value="#x_ms_date#">
<cfhttpparam name="x-ms-version" type="header" value="2017-02-22">
</cfhttp>
<cfoutput>
#cfhttp.fileContent#
</cfoutput>