Help

Base64 conversion

Topic Labels: Scripting extentions
Solved
Jump to Solution
11245 17
cancel
Showing results for 
Search instead for 
Did you mean: 
Florian_Verdon2
7 - App Architect
7 - App Architect

Hi everyone !

I am trying to authenticate a request using Basic Auth.
I then need to base64-encode my logins.
(could encode them manually and then insert but would prefer to keep that logic in the code)

I didn’t found how to achieve this “natively” without rewriting the entire encoding function.
btoa() does not seems to work :confused:

Can anyone help me on this ?

Thanks

2 Solutions

Accepted Solutions
kuovonne
18 - Pluto
18 - Pluto

Even though I get the squiggly underlines under btoa, the code runs just fine when I use it.

There are enough times when squiggly red underlines appear for working code, that if the logic makes sense to me and the code runs, I ignore the squiggly red underlines.

See Solution in Thread

Yourapp
4 - Data Explorer
4 - Data Explorer

Hi All!

Based on @apg314 i came up with this automated scrip that copy one value and past it i othe place in Base 64:

 

 

function btoa(token) {
  var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/\r\n/g,"\n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}
  return Base64.encode(token)
}
// Query for every record in "table1" field1copy
let table = base.getTable("table1");

let tableQuery = await table.selectRecordsAsync();

for(let tableRec of tableQuery.records) {
    b64 = btoa(tableRec.getCellValue("Field1copy"));
    
        // Insert records in "field2paste" table1
await table.updateRecordAsync(tableRec, {
            "Field2paste" : b64,
        });
}
 
 
Hope it is useful for someone.



See Solution in Thread

17 Replies 17

Can’t really say what the issue is without seeing the scripting context. Is this in a Script Block? Scrip automation? Custom App? External script accessing via the Airtable API?

If you want to learn more, you have to share the details.

Thank you for your reply.

I am trying to fetch from a Script Block.

Florian

Okay - that’s helpful, but not likely enough to comment more than generally. Without seeing exactly what you’re trying to run through a base64 encoding process, we’re still in the dark.

Given that Script Blocks are everyday javascript, btoa() should work just fine unless there are some strange characters in the string being encoded…

btoa() accepts a “string” where each character represents an 8-bit byte – if you pass a string containing characters that can’t be represented in 8 bits, it will probably break. This isn’t a problem if you’re actually treating the string as a byte array, but if you’re trying to do something else then you’ll have to encode it first.

Actually, btoa() function is not found.

Capture d’écran 2020-11-03 à 16.11.40

Tried window.btoa() as well with no success.
I don’t really know how this function is supposed to work in the context of Airtable Script Block.

It should probably be something else than window but can’t find what.

kuovonne
18 - Pluto
18 - Pluto

Even though I get the squiggly underlines under btoa, the code runs just fine when I use it.

There are enough times when squiggly red underlines appear for working code, that if the logic makes sense to me and the code runs, I ignore the squiggly red underlines.

Hmm… works fine for me:

image

Script…

output.markdown('## BtoA() Test');

output.markdown('### User/Password');
let pw = "bfg:123456";
output.inspect(pw);

output.markdown('### Base64 of User/Password');
let b64 = btoa(pw);
output.inspect(b64);
Florian_Verdon2
7 - App Architect
7 - App Architect

Ok thank you, I didn’t try to run it…
I am not used to run the code when editor shows an error :grinning_face_with_sweat:

Thank you !

Just a followup note, while btoa() works for me in Scripting app (despite the squiggly red underline), it does not work for me in an automation action script.

This is why I was so careful to understand the scripting context. This is a possible out on the script action side.