jm123456
jm123456

Reputation: 635

Can't insert into table with RLS despite being logged in?

I want to add a row to a profiles table in the public schema immediately after the user has signed up and their auth user has been created in the database.

The user gets created successfully, and I can see the details of the user in the returned user object from the supabase.auth.signUp function.

However when I try to do a manual insert to the table, I get an error back saying the RLS on the table is being violated. However the user is logged in and the uid is correct, so why won't it let me insert data?

async function handleSubmit(e: any) {
    e.preventDefault()

    const email = emailRef.current.value;
    const password = passwordRef.current.value;

    // const navigate = useNavigate();

    const {user, error} = await signUp({email, password});

    if(error){
      alert("Error signing in");
    } else {
      await addUserDetails({
        uuid: user.id, 
        firstName: firstNameRef.current.value, 
        lastName: lastNameRef.current.value
      });
      navigate("/dashboard");
    }
  }

  return //rest of component 
  }


export async function addUserDetails({
  uuid, firstName, lastName
}){
  const {data, error } = await supabase.from("profiles").insert([{
    id: uuid,
    first_name: firstName,
    last_name: lastName
  }])
}

RLS on table
create policy "Users can insert their own profile."
  on profiles for insert
  with check ( auth.uid() = id );

Upvotes: 3

Views: 2150

Answers (2)

Sam Carlton
Sam Carlton

Reputation: 1444

I was stuck on this for 2 days. It turns out it's because I was running Supabase in a Node test environment, and Supabase silently fails to setup a session and user id when not in a browser environment like Chromium or jsdom.

You can fix it by using a browser environment like jsdom for your testing environment or just using Playwright.

Rough example:

// @vitest-environment jsdom

test('use jsdom in this test file', () => {
  const expectedName = 'Sam';

  await supabase.from("profiles").insert([{
    id: uuid,
    first_name: expectedName
  }]);

  const { data: profile } = await supabase.from("profiles")
    .select()
    .eq( 'id', uuid )


  expect( profile.first_name ).toEqual( expectedName )
});

In Vitest: https://vitest.dev/config/#environment

In Jest: https://jestjs.io/docs/configuration#testenvironment-string

Upvotes: 0

chinedu
chinedu

Reputation: 21

Try this:

const {data, error } = await supabase.from("profiles").insert([{
    id: uuid,
    first_name: firstName,
    last_name: lastName
  }],{ returning: "minimal" }) 

Upvotes: 2

Related Questions