错误:无法解析的属性或标识符:Base64

时间:2013-12-31 17:59:44

标签: mule esb mule-studio

我正在尝试调用受基本身份验证保护的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>

调用此流会导致以下错误:

  1. [错误:无法解析的属性或标识符:Base64] [近:{...“基本”+ Base64.encodeBase64String(“com ....}]
  2. 我看到MuleStudio附带了commons-codec-1.3-osgi.jar,而Base64 API没有包含在内,只有更高版本。

    所以我的问题是:

    1. 这是调用受基本身份验证保护的REST服务的正确方法吗?

    2. 如何解决此问题?

    3. 如何让Mulestudio引用commons-codec-1.9 jar而不是commons-codec-1.3-osgi.jar?

    4. 环境细节: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>
      

3 个答案:

答案 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>

或在表达式中使用完全限定的类名。

但是...

  1. 否,在端点上配置用户名和密码。请参阅:http://www.mulesoft.org/documentation/display/current/Mule+Endpoint+URIs
  2. 同上。
  3. 别。坚持骡子提供的版本。如果您坚持使用最新版本,则需要将其与应用程序打包并使用classloader覆盖以确保您的应用程序将使用打包的Commons Codec。请参阅:http://www.mulesoft.org/documentation/display/current/Classloader+Control+in+Mule#ClassloaderControlinMule-Fine-GrainedClassloadingControl

答案 2 :(得分:0)

在http:outbound-endpoint上嵌入用户名和密码不起作用,因为密码有一个特殊字符('@'),它引发了一个不同的异常。我使用不同的方法使其工作并在问题中更新它。