Firebase Auth с Supabase

Это краткое руководство по использованию 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.

Но об этих и, возможно, других вещах важно подумать при использовании этого подхода.

🚀

Оцените статью
devanswers.ru
Добавить комментарий