Это краткое руководство по использованию Row Level Security от Supabase с Firebase Auth на Flutter без необходимости написания дополнительного промежуточного ПО.
Supabase официально поддерживает множество провайдеров аутентификации, включая SuperTokens, AuthO и другие. Однако в настоящее время нет ничего для Firebase, но, честно говоря, я не уверен в большом количестве подобных случаев использования, так что, возможно, именно поэтому его не существует…
Я застрял на несколько дней, пытаясь разобраться в этом. Поэтому будет справедливо поделиться тем, к чему я пришел, как решением для других — тем более, что я заметил пару вопросов.
Шаг 1: Создайте таблицу в Supabase
Предполагая, что у вас уже есть проект в Supabase, создайте таблицу пользователей и включите RLS в процессе, используя приведенный ниже код.
CREATE TABLE users (
user_id VARCHAR(250) PRIMARY KEY,
email VARCHAR(250) NOT NULL
);
ALTER TABLE users ENABLE ROW POLICY;
Шаг 2: Создайте функцию валидатора
Вы можете использовать любой из ключей в полезной нагрузке JWT для верификации пользователя, но для этого руководства я буду использовать ключ «email verified». Ниже приведен код:
CREATE OR REPLACE FUNCTION email_verified()
RETURN boolean LANGUAGE sql stable AS
$$
SELECT NULLIF(
current_setting('request.jwt.claims', true)::json ->> 'email_verified', 'false'
)::boolean;
$$;
Шаг 3: Включите политики RLS
Используя диалог создания политики, вот код, который нужно использовать для выражения CHECK.
NB: Для INSERT-запросов важно, чтобы у вас также была установлена политика SELECT. В противном случае ваши запросы не будут выполняться
email_verified() = true
Шаг 4: Отмените JWT по умолчанию
Создайте надбазовый JWT
Для этого вам понадобятся:
- Firebase JWT,
- Ваш секрет JWT Supabase,
- библиотека dart_jsonwebtoken и
- библиотека jwt_decoder
Ниже приведен код для создания токена supabase
accessToken() async
{
// GET JWT from Firebase
String firebaseToken = await FirebaseAuth.instance.currentUser!.getIdToken();
// Decode JWT to extract payload
Map payload = JwtDecoder.decode(firebaseToken);
return JWT(payload).sign(SecretKey("[SUPABASE JWT SECRET]"));
}
Вызовите setAuth из клиента Supabase
Supabase.instance.client.auth.setAuth(accessToken());
Вот и все!
Теперь вы успешно подключили FirebaseAuth к Supabase, сохранив при этом безопасность.
Есть некоторые вещи, которые я не рассматриваю здесь для краткости. Такие вещи, как:
- Синхронизация пользователей между двумя системами
- Проверка электронной почты пользователя в FirebaseAuth.
Но об этих и, возможно, других вещах важно подумать при использовании этого подхода.
🚀