cli icon indicating copy to clipboard operation
cli copied to clipboard

Support for auth.phone in the config file

Open wladpaiva opened this issue 3 years ago • 2 comments

Feature request

Is your feature request related to a problem? Please describe.

Yes, supabase cli doens't allow to config the phone authentication

Describe the solution you'd like

Currently the config.toml allows the configuration of many things related to email auth but none for the phone auth although the docker gotrue has those env vars

GOTRUE_SMS_AUTOCONFIRM="false"
GOTRUE_SMS_MAX_FREQUENCY="5s"
GOTRUE_SMS_OTP_EXP="6000"
GOTRUE_SMS_OTP_LENGTH="6"
GOTRUE_SMS_PROVIDER="twilio"
GOTRUE_SMS_TWILIO_ACCOUNT_SID=""
GOTRUE_SMS_TWILIO_AUTH_TOKEN=""
GOTRUE_SMS_TWILIO_MESSAGE_SERVICE_SID=""
GOTRUE_SMS_TEMPLATE="This is from supabase. Your code is {{ .Code }} ."
GOTRUE_SMS_MESSAGEBIRD_ACCESS_KEY=""
GOTRUE_SMS_MESSAGEBIRD_ORIGINATOR=""
GOTRUE_SMS_TEXTLOCAL_API_KEY=""
GOTRUE_SMS_TEXTLOCAL_SENDER=""
GOTRUE_SMS_VONAGE_API_KEY=""
GOTRUE_SMS_VONAGE_API_SECRET=""
GOTRUE_SMS_VONAGE_FROM=""

Describe alternatives you've considered

You can run a docker-compose file shared in the supabase/supabase repository with all those settings but it is heavily overwhelming configure everything. The supabase cli makes it soooo much faster to init a supabase dev environment.

Additional context

Add any other context or screenshots about the feature request here.

wladpaiva avatar Feb 25 '22 23:02 wladpaiva

Just to let you know, what we did to solve this is to force the OTP (confirmation_token) to be 123456 and the confirmation_sent_at to be now() in a trigger. Of course we're not testing the integration with the sms provider but that's better to keep costs low.

darlanjunior avatar May 12 '22 20:05 darlanjunior

Is there any update here? We'd like to be able to integrate with our SMS provider locally, to test the entire auth journey

sdaoud avatar Sep 15 '22 10:09 sdaoud

@darlanjunior could you share the trigger? Also, how did you bypass the error Error sending sms: sms Provider could not be found

MoaathAlattas avatar Feb 14 '23 03:02 MoaathAlattas

CREATE OR REPLACE FUNCTION auth.force_otp()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$BEGIN
  NEW.confirmation_token := 123456;
  NEW.confirmation_sent_at := now();
  return new;
END;$function$
;

create trigger force_otp before
update
    on
    auth.users for each row execute function auth.force_otp();

You can safely ignore the error and just attempt to sign in. It only works once per user, unfortunately.

darlanjunior avatar Feb 14 '23 12:02 darlanjunior

You can safely ignore the error and just attempt to sign in. It only works once per user, unfortunately.

thanks @darlanjunior! after some digging I created a db function that I call manually on sign in only on dev mode. Still not the nicest but does the job for now.

CREATE OR REPLACE FUNCTION public.mock_phone_otp(phone text)
 RETURNS void
 LANGUAGE plpgsql
 SECURITY DEFINER
AS $function$begin
  UPDATE auth.users
      SET confirmation_token = encode(sha224(concat(mock_phone_otp.phone,'123456')::bytea), 'hex'),
          confirmation_sent_at = now()
    WHERE users.phone = mock_phone_otp.phone;
  end;
$function$
;

in code it would be something like:


const { error } = await sdk.auth.signInWithOtp({
    phone: phoneNumber,
});

if (DEV) {
    await sdk.rpc("mock_phone_otp", {
        phone: phoneNumber,
    });
} else if (error) {
    console.error(error);
    return redirect(`/sign-in`);
}

References: https://github.com/supabase/gotrue/blob/ed7b2dc5001a95d96f7a56bb463cfd265279ac2e/internal/api/verify_test.go#L633

MoaathAlattas avatar Feb 19 '23 02:02 MoaathAlattas

Here's a fleshed out version of @MoaathAlattas's code:

const code = "123456"

function mockOtp() {
   const normalisedPhone = phone.replace(/^0/, '').replace(/\+/, '')
   await supabase.rpc("mock_phone_otp", { code, phone: normalisedPhone })
}

// Then later, use the same arbitrary code you defined earlier:

await supabase.auth.verifyOtp({
   phone: phone,
   token: code,
   type: 'sms'
});

Pass in your own OTP code in the SQL function:

+CREATE OR REPLACE FUNCTION public.mock_phone_otp(phone text,code text)
 RETURNS void
 LANGUAGE plpgsql
 SECURITY DEFINER
AS $function$begin
  UPDATE auth.users
      SET confirmation_token = encode(sha224(concat(mock_phone_otp.phone,mock_phone_otp.code)::bytea), 'hex'),
          confirmation_sent_at = now()
    WHERE users.phone = mock_phone_otp.phone;
  end;
$function$

janbaykara avatar Mar 08 '23 10:03 janbaykara