🧱 Суть

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.

Она определяет, от чьего имени выполняется запрос:

  • anon
  • authenticated

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.

🔗 Связано