我正在尝试调用受基本身份验证保护的REST服务,但我无法完成这项工作。基本上,我需要将授权标头设置为 “授权:基本[base64编码的用户名和密码]”。
我的流程如下:
<flow name="testjsonFlow1" doc:name="testjsonFlow1">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" path="testjson" doc:name="HTTP"/>
<set-property propertyName="Authorization" doc:name="Set Authentication Header" value="#["Basic " + Base64.encodeBase64String("username:password")]"/>
<http:outbound-endpoint exchange-pattern="request-response" host="<url>" port="80" path="Services/V1/testservices" method="POST" contentType="text/plain" doc:name="HTTP"/>
<echo-component doc:name="Echo"/>
</flow>
调用此流会导致以下错误:
我看到MuleStudio附带了commons-codec-1.3-osgi.jar,而Base64 API没有包含在内,只有更高版本。
所以我的问题是:
这是调用受基本身份验证保护的REST服务的正确方法吗?
如何解决此问题?
如何让Mulestudio引用commons-codec-1.9 jar而不是commons-codec-1.3-osgi.jar?
环境细节:Windows 7 64位,Mule CE 3.4。
感谢任何帮助。
更新1: 我对脚本进行了一些更新,现在可以正常工作了。这是更新的脚本:
<flow name="testjsonFlow1" doc:name="testjsonFlow1">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" path="testjson" doc:name="HTTP" />
<set-variable variableName="uName" doc:name="Variable" value="domain\user"/>
<set-variable variableName="pwd" doc:name="Variable" value="P@ssword"/>
<scripting:component doc:name="Groovy">
<scripting:script engine="Groovy">
<scripting:text><![CDATA[
def cred = message.getInvocationProperty("uName") + ":" + message.getInvocationProperty("pwd")
def credBytes = cred.bytes
def encodedCred = credBytes.encodeBase64().toString()
message.setProperty("credential",encodedCred)
return null;]]></scripting:text>
</scripting:script>
</scripting:component>
<set-property propertyName="Authorization" doc:name="Set Authentication Header" value="Basic #[header:OUTBOUND:credential]"/>
<logger level="INFO" doc:name="Logger"/>
<logger message="#[message.outboundProperties['Authorization']]" level="INFO" doc:name="Logger"/>
<http:outbound-endpoint exchange-pattern="request-response" host="myserver.com" port="80" path="Services/V1/service1/" method="POST" contentType="text/plain" doc:name="HTTP" />
</flow>
答案 0 :(得分:2)
在上面的评论中回答你的问题,但不喜欢将代码粘贴到评论编辑器中。
您可以将用户和pw添加到端点,它将像上面一样对其进行base64编码。
<http:outbound-endpoint exchange-pattern="request-response"
host="foo.bar.com" port="80"
path="getFoo" method="GET"
user="username" password="password">
</http:outbound-endpoint>
答案 1 :(得分:1)
<configuration>
<expression-language>
<import class="org.apache.commons.codec.binary.Base64" />
</expression-language>
</configuration>
或在表达式中使用完全限定的类名。
但是...
答案 2 :(得分:0)
在http:outbound-endpoint上嵌入用户名和密码不起作用,因为密码有一个特殊字符('@'),它引发了一个不同的异常。我使用不同的方法使其工作并在问题中更新它。