Issue while constructing the callout target url from KVM

Not applicable

I have a callout GET call which works perfectly when i construct the URL like below in my callout policy.

<HTTPTargetConnection>
        <Properties/>
        <URL>https://xxxxxxxx.execute-api.us-west-2.amazonaws.com/Prod/api/User?userId={accesstoken.user.login}</URL>
    </HTTPTargetConnection>

But then instead of hardcoding the URL, i have used a KVM policy to get the env variables prior to the callout policy and then modified my callout above URL as

 <HTTPTargetConnection>
        <Properties/>
        <URL>https://{lambda-api-gateway-url}/api/User?userId={accesstoken.user.login}</URL>
    </HTTPTargetConnection>

And now i am getting always 403 with "message":"Forbidden"

the Target URL it constructs looks good but do not know why i am getting 403 instead of 200.

6478-capture.png

p.s: BEfore my callout policy, i have a oAuth2.0 policy which is running ok, no problem with that

1 1 143
1 REPLY 1

Yes, it's unfortunate, but you cannot compose the URL that way in an HTTP Target connection.

Instead, you must set the variable "target.url". Something like this:

var resolveVariableReferences = (function (){
      var variableNameRe = "[^ \t\n\"',/\\\\{}]+?"; // non-greedy capture
      var varPrefixRe = '{';
      var varSuffixRe = '}';
      var variableRegex = new RegExp( varPrefixRe + '(' + variableNameRe + ')' + varSuffixRe);


      function resolveVariableReferences(s) {
        var match = variableRegex.exec(s);
        while (match){
          var variableName = match[1];
          var value = context.getVariable(variableName);
          if (value && value !== '') {
            s = s.replace('{' + variableName + '}', value);
          }
          match = variableRegex.exec(s);
        }
        return s;
      }
      return resolveVariableReferences;
    }());


var template = "https://{lambda-api-gateway-url}/api/User?userId={accesstoken.user.login}";
var resolvedValue = resolveVariableReferences(template);


context.setVariable('target.url', resolvedValue);

You should embed that into a JavaScript policy and execute it in the target request flow.