AM Journey Javascript Base64 Encoding

Hello

I am writing a journey script that is collecting some data and also reaching out to a remote service to validate some information. I need to be able to base64 encode part of the string but cannot find an encoder / method on the javascript to encode a string. Does anyone have an example / method to base64 encode strings in a journey javascript?

Thanks
Nick

try {
var frJava = JavaImporter(
java.lang.String,
org.forgerock.util.encode.Base64
);

sharedState.put(“encodedValue”, frJava.Base64.encode(notEncodedValue));

Ajay

Thanks, did this and now getting an error in the logs saying the ‘encode’ is not available. Below is a snippet of the exception.

java.util.concurrent.ExecutionException: javax.script.ScriptException: TypeError: Cannot call method \"encode\" of undefined (LoginTest.v2#22) in LoginTest.v2 at line number 22 at column number 0\n\tat org.forgerock.openam.scripting

Am also seeing this in the logs just before this…

"logger":"org.forgerock.openam.scripting.sandbox.RhinoSandboxClassShutter","message":"Classname failed to match whitelist: 'org.forgerock.util.encode.Base64'","context":"default","transactionId

Thanks
Nick

Hi Nick

Are you using ID Cloud or on-prem AM?

In ID Cloud, this class should already be whitelisted as mentioned here - Knowledge - ForgeRock BackStage

If you are using on-prem version, you may have to explicitly add this class to whitelist.

Ok, fixed the whitelist issue to allow it to run, but not is not even finding the class / method.

javax.script.ScriptException: Can't find method org.forgerock.util.encode.Base64.encode

Is there a different class / reference i should be looking for?

Nick

java.util.Base64 in case that one is available?

Hey Ajay

I got it working using the below code snippets. Had to add some classes to the AM whitelist for it to run, but this is now using the org.forgerock.util.encode.base64 utilities to encode / decode like it should.

var fr = JavaImporter(
  org.forgerock.util.encode.Base64,
  java.lang.String
);

var authStringEncoded = fr.Base64.encode(fr.String(authString).getBytes("UTF-8"));

Appreciate the help getting me in the right direction.

Thanks
Nick

2 Likes

Hi Nick,
I see other answers, but thought this may be helpful.
We’ve been using the following JavaScript snippet in production for a year or so.
No Java includes are necessary. It also works in NextGen library scripts, if you break it out of a class/object based implementation. Needless to say, make sure to test.

encodedStr = Base64.encode(str2Encode);
decodedStr = Base64.decode(str2Decode);

var Base64={_keyStr:“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=”,encode:function(input){var output=“”;var chr1,chr2,chr3,enc1,enc2,enc3,enc4;var i=0;input=Base64._utf8_encode(input);while(i<input.length){chr1=input.charCodeAt(i++);chr2=input.charCodeAt(i++);chr3=input.charCodeAt(i++);enc1=chr1>>2;enc2=(chr1&3)<<4|chr2>>4;enc3=(chr2&15)<<2|chr3>>6;enc4=chr3&63;if(isNaN(chr2)){enc3=enc4=64}else if(isNaN(chr3)){enc4=64}output=output+this._keyStr.charAt(enc1)+this._keyStr.charAt(enc2)+this._keyStr.charAt(enc3)+this._keyStr.charAt(enc4)}return output},decode:function(input){var output=“”;var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9+/=]/g,“”);while(i<input.length){enc1=this._keyStr.indexOf(input.charAt(i++));enc2=this._keyStr.indexOf(input.charAt(i++));enc3=this._keyStr.indexOf(input.charAt(i++));enc4=this._keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!=64){output=output+String.fromCharCode(chr2)}if(enc4!=64){output=output+String.fromCharCode(chr3)}}output=Base64._utf8_decode(output);return output},_utf8_encode:function(string){string=string.replace(/\r\n/g,“\n”);var utftext=“”;for(var n=0;n<string.length;n++){var c=string.charCodeAt(n);if(c<128){utftext+=String.fromCharCode(c)}else if(c>127&&c<2048){utftext+=String.fromCharCode(c>>6|192);utftext+=String.fromCharCode(c&63|128)}else{utftext+=String.fromCharCode(c>>12|224);utftext+=String.fromCharCode(c>>6&63|128);utftext+=String.fromCharCode(c&63|128)}}return utftext},_utf8_decode:function(utftext){var string=“”;var i=0;var c=c1=c2=0;while(i<utftext.length){c=utftext.charCodeAt(i);if(c<128){string+=String.fromCharCode(c);i++}else if(c>191&&c<224){c2=utftext.charCodeAt(i+1);string+=String.fromCharCode((c&31)<<6|c2&63);i+=2}else{c2=utftext.charCodeAt(i+1);c3=utftext.charCodeAt(i+2);string+=String.fromCharCode((c&15)<<12|(c2&63)<<6|c3&63);i+=3}}return string}};

1 Like