Интеграция с Supabase
Узнайте, как интегрировать Logto с Supabase для улучшения процесса аутентификации в ваших приложениях.
Узнайте, как интегрировать Logto с Supabase для улучшения процесса аутентификации в ваших приложениях.
Logto — это современный провайдер услуг аутентификации личности, который предлагает безопасную, комплексную и удобную поддержку входа в приложения. Он также предоставляет множество SDK и руководств по интеграции для различных фреймворков и языков программирования, что позволяет вам беспрепятственно интегрировать корпоративные услуги аутентификации в ваше приложение в считанные минуты.
Эта статья главным образом сосредоточена на том, как интегрировать Supabase с Logto.
Supabase использует Многоуровневую безопасность на уровне строк Postgres для управления доступом к данным. Проще говоря, создавая политики безопасности на уровне строк для таблиц в базе данных, мы можем ограничивать и управлять доступом каждого пользователя к чтению, записи и обновлению данных в таблице.
Предположим, у вас есть таблица под названием "posts" в вашей базе данных со следующим содержимым:

Поле user_id в таблице представляет пользователя, которому принадлежат данные каждого поста. Вы можете ограничить каждого пользователя доступом только к своим данным постов на основе поля user_id.
Однако, прежде чем это может быть реализовано, Supabase должно идентифицировать текущего пользователя, который обращается к базе данных.
Благодаря поддержке JWT в Supabase, когда наше приложение взаимодействует с Supabase, мы можем сгенерировать JWT, содержащий данные пользователя, используя секрет JWT, предоставленный Supabase. Затем мы используем этот JWT в качестве заголовка Authentication при отправке запросов. После получения запроса Supabase автоматически проверяет действительность JWT и предоставляется доступ к данным внутри JWT на протяжении всех последующих процессов.
Сначала мы можем получить секрет JWT, предоставленный Supabase, в "Настройки проекта" на панели управления Supabase:

Затем, при использовании SDK Supabase для отправки запросов в Supabase, мы используем этот секрет для генерации нашего JWT и прикрепляем его в качестве заголовка Authentication к запросу. (Обратите внимание, что этот процесс происходит в сервисе вашего приложения на стороне сервера, и секрет JWT никогда не должен быть раскрыт третьим лицам).
Далее перейдите в SQL Editor на панели управления Supabase и создайте функцию для получения userId, переданного в запросе:

Код, использованный на изображении, выглядит следующим образом:
Как показано в коде, в Supabase можно получить payload JWT, который мы генерируем, вызвав request.jwt.claims. Поле userId внутри payload — это значение, которое мы задали.
С помощью этой функции Supabase может определить, какой пользователь в настоящее время обращается к базе данных.
Затем мы можем создать политику на уровне строк, чтобы ограничить каждого пользователя доступом только к своим данным постов на основе поля user_id в таблице постов.
using кода ниже введите:
Используя такие политики, можно эффективно контролировать доступ к данным внутри Supabase.
В реальных приложениях вы можете создать различные политики для ограничения действий пользователей, таких как добавление или изменение данных. Однако это выходит за рамки данной статьи. Для получения дополнительной информации о политике на уровне строк (RLS) обратитесь к Защите ваших данных с помощью Postgres Row Level Security.
Как упоминалось ранее, поскольку Supabase использует RLS для контроля доступа, ключ к интеграции с Logto (или любым другим сервисом аутентификации) заключается в получении идентификатора пользователя и его отправке в Supabase. Весь процесс показан на диаграмме ниже:
Теперь мы объясним, как интегрировать Logto с Supabase на основе этой процессной диаграммы.
Logto предлагает руководства по интеграции для различных фреймворков и языков программирования.
Обычно приложения, созданные с использованием этих фреймворков и языков, можно отнести к следующим категориям: нативные приложения, SPA (одностраничные приложения), традиционные веб-приложения и M2M (приложения «машина-машина»). Вы можете перейти на страницу Logto Quick Start, чтобы интегрировать Logto в свое приложение на основе используемой вами технологической платформы. После этого следуйте инструкциям ниже, чтобы интегрировать Logto в ваш проект в зависимости от типа вашего приложения.
И нативные приложения, и SPA выполняются на вашем устройстве, и учетные данные (токен доступа), полученные после входа в систему, хранятся локально на вашем устройстве.
Следовательно, при интеграции вашего приложения с Supabase вам нужно взаимодействовать с Supabase через ваш бэкенд-сервис, так как вы не можете раскрывать конфиденциальную информацию (например, секрет JWT Supabase) на каждом устройстве пользователя.
Допустим, вы создаете свое SPA с использованием React и Express. Вы успешно интегрировали Logto в ваше приложение, следуя Руководству по Logto React SDK (вы можете ознакомиться с кодом в нашем React sample). Кроме того, вы добавили проверку токена доступа Logto в ваш серверный API в соответствии с документацией Защита вашего API в Node (Express).
Далее вы будете использовать токен доступа, полученный от Logto, для запроса пользовательских данных с вашего серверного API:
На вашем сервере backend вы уже извлекли идентификатор вошедшего пользователя из access token с помощью middleware:
Теперь вы можете использовать getSupabaseClient, описанный выше, чтобы прикрепить userId к JWT, используемому в последующих запросах к Supabase. Либо вы можете создать middleware для создания клиента Supabase для тех запросов, которые должны взаимодействовать с Supabase:
В последующем процессе вы можете напрямую вызывать ctx.supabase для взаимодействия с Supabase:
В этом коде Supabase вернет данные постов, принадлежащие только текущему пользователю, на основе ранее установленных политик.
Главное различие между традиционным веб-приложением и нативным приложением или SPA заключается в том, что традиционное веб-приложение рендерит и обновляет страницы исключительно на веб-сервере. Следовательно, учетные данные пользователей управляются непосредственно веб-сервером, тогда как в нативных приложениях и SPA они находятся на устройстве пользователя.
При интеграции Logto с традиционным веб-приложением в Supabase вы можете напрямую извлечь идентификатор вошедшего пользователя из бэкэнда.
Взяв за пример проект на Next.js, после интеграции Logto в ваш проект, следуя Руководству по Next.js SDK, вы можете использовать SDK Logto для получения информации о пользователе и построения соответствующего JWT для взаимодействия с Supabase.
Связь типа «машина-машина» (M2M) часто используется, когда вашему приложению необходимо напрямую взаимодействовать с серверами ресурсов, например, статическим сервисом, который ежедневно собирает посты и т.д.
Вы можете использовать руководство Machine-to-machine: Auth with Logto, чтобы установить аутентификацию приложения «машина-машина». Интеграция Supabase с приложениями типа «машина-машина» схожа с интеграцией нативных приложений и SPA (как описано в разделе "Нативное приложение или одностраничное приложение"). Это предполагает получение токена доступа от Logto, а затем его проверку с помощью защищенного бэкэнд API.
Однако важно отметить, что приложения типа нативных и SPA обычно предназначены для конечных пользователей, поэтому идентификатор пользователя, получаемый в этих приложениях, представляет самого пользователя. Однако токен доступа для приложений типа "машина-машина" представляет само приложение, и поле sub в payload токена доступа является идентификатором клиента M2M приложения, а не конкретного пользователя. Поэтому при разработке важно разграничивать данные, предназначенные для приложений типа "машина-машина".
Более того, если вы хотите, чтобы конкретное приложение "машина-машина" получало доступ к Supabase от имени всего сервиса, обходя ограничения RLS, вы можете использовать секрет service_role Supabase для создания клиента Supabase. Это полезно, когда вы хотите реализовать административные или автоматические задачи, требующие доступа ко всем данным без ограничений, установленных политиками безопасности на уровне строк для отдельных пользователей.
Секрет service_role можно найти на той же странице, что и секрет JWT:

При создании клиента Supabase используйте секрет service_role, и этот клиент сможет получить доступ ко всем данным в базе данных:
В этой статье мы подробно обсудили интеграцию Logto с Supabase, осветив ключевые аспекты и важные элементы интеграции. Мы рассмотрели такие концепции, как аутентификация с использованием JWT и политики безопасности на уровне строк, руководствуясь процессом беспрепятственной интеграции Logto в приложения, использующие Supabase. С этими знаниями мы надеемся, что вы сможете уверенно повысить безопасность вашего приложения, расширить его функциональность и даже дополнить проекты новыми функциями.