🧱 Суть
JWT (JSON Web Token) – это токен, который содержит информацию о пользователе и используется для подтверждения его личности.
В Supabase JWT создаётся после успешной авторизации.
Он содержит:
- идентификатор пользователя;
- роль;
- время жизни токена;
- метаданные пользователя.
Этот токен отправляется вместе с запросами к Supabase и позволяет базе понять:
“Кто делает этот запрос и какие у него права?”
📦 Как работает JWT
Общая схема:
Пользователь входит
|
↓
Supabase Auth
|
↓
Создание JWT
|
↓
Клиент хранит session
|
↓
Каждый запрос отправляет JWT
|
↓
PostgreSQL проверяет праваЧто находится внутри JWT
Пример упрощённого токена:
{
"sub": "229cfdd2-afe1-4367-87bf-dd72900f0105",
"role": "authenticated",
"email": "user@gmail.com",
"app_metadata": {
"role": "admin"
}
}Главные поля
sub
"sub": "uuid"Это идентификатор пользователя.
В Supabase он соответствует:
auth.users.idИспользуется через:
auth.uid()role
"role": "authenticated"Это системная роль Supabase.
Она определяет, от чьего имени выполняется запрос:
anonauthenticated
app_metadata
"app_metadata": {
"role": "admin"
}Это кастомные данные приложения.
Именно сюда попадает:
raw_app_meta_dataиз:
auth.usersИспользование в RLS
Например, разрешить доступ только администраторам:
CREATE POLICY "Only admins"
ON public.some_table
FOR ALL
USING (
auth.jwt()->>'role' = 'admin'
);Здесь:
auth.jwt()получает текущий JWT пользователя.
Получение пользователя в коде
Проверить текущую сессию:
const {
data: { session }
} = await supabase.auth.getSession();Получить пользователя:
const {
data: { user }
} = await supabase.auth.getUser();Важно
JWT – это не живая запись из базы.
Если изменить данные пользователя:
raw_app_meta_data.role = 'admin'старый JWT не изменится.
Пользователю нужен новый токен:
- выйти;
- войти снова;
- получить обновлённую session.
Проблема устаревшего JWT
Например:
В базе:
{
"role": "admin"
}А у пользователя старый токен:
{
"role": "user"
}RLS будет считать пользователя обычным.
Пока JWT не обновится – новые права не применятся.
🎯 Вывод
- JWT – это “паспорт” пользователя для Supabase.
- В нём находятся данные, которые нужны для проверки доступа.
auth.uid()берёт идентификатор пользователя из JWT.auth.jwt()позволяет читать данные токена в RLS.- После изменения ролей нужен новый JWT.