Search code examples
muleesbmule-studio

Error: unresolvable property or identifier: Base64


I'm trying to call a REST service that is protected by basic authentication and I can't get this work. Basically, I need to setup the authorization header as "Authorization: Basic [base64 encoded user name and password]".

My flow looks like this:

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

Invoking this flow results in the following error:

  1. [Error: unresolvable property or identifier: Base64] [Near : {... "Basic " + Base64.encodeBase64String("com ....}]

I see that the MuleStudio ships with commons-codec-1.3-osgi.jar while the Base64 API is not included and only comes with later version.

So my questions are:

  1. Is this the right way to call a REST service that is protected with basic auth?

  2. How can I resolve this issue?

  3. How can I make the Mulestudio reference the commons-codec-1.9 jar instead of the commons-codec-1.3-osgi.jar?

Environment details: Windows 7 64 bit, Mule CE 3.4.

Any help is appreciated.

Update 1: I made some updates to the script and it works now. Here is the updated script:

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

Solution

  • Embedding user name and password on the http:outbound-endpoint didn't work as the password had a special character ('@') which was throwing a different exception. I made it work with a different approach and updated it in the question.