Search code examples
encryptionsupabasesupabase-js

Strings Inserted Into Supabase's Encrypted Columns Aren't Stored / Retrieved Correctly


This should be pretty simple, according to the docs...I'm trying to store and retrieve a string in an encrypted column in my Supabase database.

Inserting a string manually via the dashboard works - the string is encrypted and then I can view it in the decrypted database view. But if I insert a string via the API, then the decrypted value isn't displayed in the decrypted database view or formatted correctly when it's retrieved via the API. I still get an encrypted string back.

api_key is the encrypted column.

async function saveCustomer(customerId, accessToken) {
  const customerData = {
    id: customerId,
    api_key: accessToken,
  };

  try {
    await createRowInTable('customers', customerData, 'id');
  } catch (error) {
    throw new Error('Unexpected error in saveCustomer:', error);
  }
}
async function createRowInTable(tableName, rowData, conflictField) {
  try {
    const { data: result, error } = await supabase
      .from(tableName)
      .upsert(rowData, { onConflict: conflictField });

    if (error) {
      throw new Error(`Error inserting row into ${tableName}:`, error);
    }

    return result;
  } catch (err) {
    throw new Error('Unexpected error in createRowInTable:', err);
  }
}

Note - I've asked about this in the Supabase Discord and created a Github Issue but got no response after more than 12 hours. I'll update this post if I find the solution elsewhere first.


Solution

  • This is a bug on supabase js library. you have to use supabase RPC function to do the upsert.

    Code example