Перейти до вмісту

Основи безпеки

Де знайти API-ключі Supabase: anon, service_role і URL

URL проєкту, ключ anon і ключ service_role лежать на одній сторінці панелі. Ось де вона, і яке з чотирьох значень має бути у вашому застосунку.

Vlad Tkachenko8 хв читання
Панель налаштувань: URL і ключ anon показані повністю, ключ service_role і значення JWT сховані за крапками.

Коротко

  • Усі ключі Supabase, включно з service_role, лежать на одній сторінці: відкрийте свій проєкт у панелі, далі Settings → API Keys.
  • Там чотири значення. URL проєкту і публічний ключ мають бути у вашому застосунку, секретний ключ і значення JWT не мають бути там ніколи.
  • Ця сторінка каже, які ключі існують. Вона не каже, який із них потрапив у ваш застосунок, а зашкодити може лише друге питання.

Щось попросило у вас ключ Supabase. Інструкція зі встановлення, гілка підтримки або ШІ, якому ви доручили полагодити застосунок. Ви відкриваєте панель, бачите сторінку з адресою і двома чи трьома ключами з назвами на кшталт anon та service_role, і кожен із них має вигляд можливої відповіді.

Або це інша версія тієї самої історії. Хтось відкрив ваш сайт, натиснув F12 і сказав, що ключ видно назовні. Тепер ви хочете подивитися на ключ, який ця людина знайшла, і не знаєте, де він живе.

Більшість інструкцій починаються зі сторінки API-ключів. Це припускає, що ви вже знаєте, який проєкт Supabase ваш, а саме цей крок білдер зробив за вас і ніколи не пояснив.

Де в Supabase лежать API-ключі?

У панелі, всередині вашого проєкту, у розділі Settings → API Keys.

Повний шлях: увійдіть на supabase.com, оберіть свій проєкт зі списку, відкрийте Settings у лівій бічній панелі, далі API Keys. Майже кожна інструкція і кожен скріншот, які ви знайдете, називають цю сторінку Settings → API, бо донедавна вона так і звалася. Це та сама сторінка з тими самими значеннями.

Усе на ній належить до однієї з двох речей. Адреса, яка каже, де живе ваш проєкт. Або ключ, який вирішує, що запиту дозволено робити, коли він туди дістанеться. Сторінка перелічує їх разом, в одній колонці, тим самим шрифтом.

Я не налаштовував Supabase. Який проєкт мій?

Прочитайте адресу, якою ваш застосунок і так уже користується. Відповідь усередині неї.

Кожен проєкт Supabase має референс: короткий випадковий рядок, який водночас є першою частиною адреси проєкту, https://yourreference.supabase.co. Ваш застосунок надсилає запит на цю адресу під час кожного завантаження сторінки, тож цей рядок уже є у вашому застосунку, і це той самий рядок, яким панель називає ваш проєкт.

Три місця, де його знайти, нікого не питаючи:

  • У вашому білдері. Lovable, Bolt, v0 та інші показують підключений проєкт Supabase десь у налаштуваннях або в розділі інтеграцій вашого проєкту.
  • У вашому браузері. Відкрийте живий застосунок, натисніть F12, перейдіть на вкладку Network і перезавантажте сторінку. Запити, що йдуть кудись на .supabase.co, несуть референс у своїй адресі.
  • У вихідному коді сторінки, якщо ваш застосунок пише адресу в HTML, а не у файл скрипта.

Далі увійдіть на supabase.com і звірте цей референс зі списком своїх проєктів. Білдери підключають Supabase через ваш власний акаунт, тож проєкт зазвичай лежить у панелі, до якої ви колись зареєструвалися й ніколи нею не користувалися. Щойно ви заходите в проєкт, референс з'являється в адресному рядку браузера, і саме так ви переконуєтеся, що зайшли в потрібний, перш ніж щось звідти копіювати.

Чотири речі на цій сторінці

Адреса і три ключі. Двом місце у вашому застосунку, а двоє ніколи не залишають панель.

Що ви бачитеЩо цеКуди воно йдеЯкщо витече
Project URLАдреса вашого проєкту, https://yourreference.supabase.co. Каже де, ніколи хто.У застосунокНічого. Вона й так потрапляє до кожного відвідувача під час кожного завантаження.
Publishable key sb_publishable_…Називає проєкт і не має власних прав. У старому проєкті зветься anon.У застосунокНічого сам собою. Він читає рівно те, що дозволяють ваші правила Row Level Security.
Secret key sb_secret_…Читає і пише кожен рядок у кожній таблиці, хай що кажуть ваші правила. У старому проєкті зветься service_role.Лише серверКожен рядок у кожній таблиці, для того, хто його знайшов.
JWT secretПідписує токени, які кажуть, хто увійшов. У новому проєкті зветься JWT signing keys.Лишається в SupabaseХтось може випустити токен, який стверджує, що він будь-хто з ваших користувачів, зокрема адміністратор.
Чотири значення, одна сторінка. Supabase не проводить між ними жодної лінії, і маска над двома нижніми це єдина підказка, яку ви отримуєте.

На самій сторінці лежить підказка. Supabase друкує URL проєкту і публічний ключ там, де ви можете їх прочитати, і закриває секретний ключ та значення JWT крапками, доки ви не попросите їх показати. Ті двоє, які він закриває, і є тими двома, яким ніколи не місце у вашому застосунку.

Де знайти URL мого проєкту Supabase?

У двох місцях, і на одне з них ви, найпевніше, зараз дивитеся. Панель друкує його вгорі сторінки Settings → API Keys, з підписом Project URL. Адресний рядок браузера показує той самий рядок щоразу, коли ваш застосунок говорить із Supabase, у формі https://yourreference.supabase.co.

У коді він має одне з трьох імен, і всі три тримають той самий рядок:

  • VITE_SUPABASE_URL у застосунку на Vite, а це більшість того, що будують Lovable і Bolt
  • NEXT_PUBLIC_SUPABASE_URL у застосунку на Next.js
  • SUPABASE_URL на сервері, в edge function або у скрипті

Середина, yourreference, це референс вашого проєкту. Саме за цим рядком панель упізнає проєкт, і саме його ви звіряєте, коли проєктів кілька й незрозуміло, який із них належить цьому застосунку.

Це адреса, а не таємниця, і тому вона лежить відкрито поруч із публічним ключем.

Де ключ service_role і що таке SUPABASE_SERVICE_ROLE_KEY?

На тій самій сторінці, що й усе решта. Відкрийте Settings → API Keys і знайдіть рядок service_role, або secret на щойно створеному проєкті. На відміну від URL і публічного ключа, його значення сховане за кнопкою показу, доки ви не попросите.

Ця кнопка лишається єдиним натяком панелі на те, що цей ключ інакший, і сприймати його варто серйозно: Supabase закриває саме ті значення, які ніколи не повинні дістатися браузера.

SUPABASE_SERVICE_ROLE_KEY це ім'я змінної, а не другий ключ: за ним стоїть те значення, яке ви щойно відкрили. Ви зустрінете його у файлі .env, у налаштуваннях середовища вашого хостингу або в секретах edge function. Важливий префікс перед ним. Змінна на ім'я VITE_SUPABASE_SERVICE_ROLE_KEY або NEXT_PUBLIC_SUPABASE_SERVICE_ROLE_KEY компілюється всередину JavaScript, який завантажують ваші відвідувачі, тож ключ стає публічним у мить деплою. Ці префікси є вказівкою публікувати, а не недоглядом.

Його місце це edge function, обробник вебхука, запланована задача або міграційний скрипт: усюди, де код працює на машині, яку ви контролюєте, і жоден відвідувач не відкриє файл. Це ключ, який повністю обходить Row Level Security, тож він читає кожен рядок у кожній таблиці, хоч би що казали ваші правила.

Якщо ви не певні, що ваш лишився на сервері, наш безплатний сканер безпеки сайту читає ваш живий сайт іззовні й називає ключі, які знаходить, приблизно за 20 секунд.

Який ключ потрібен моєму застосунку?

URL проєкту і публічний ключ. Більше нічого й ніколи.

Ваш застосунок працює в браузері відвідувача і звідти розмовляє з Supabase, тож обидва значення за задумом потрапляють до кожного відвідувача. Це не витік і ніколи ним не було. Незнайомця від читання всієї вашої бази з публічним ключем утримує Row Level Security: правила, які рядок за рядком вирішують, кому що дозволено бачити.

Отже, саме ці правила варто перевірити, коли ви хвилюєтеся, і увімкнути їх не те саме, що бути захищеним. Довга версія того, чому один ключ безпечний на видноті, лежить у які API-ключі безпечні у фронтенді.

Як дізнатися, який ключ насправді потрапив у застосунок?

З панелі цього не видно. Вона перелічує ключі, які має ваш проєкт, а не той, який пішов у ваш застосунок.

Це два різні питання, і зашкодити може лише друге. Проєкт може мати цілком звичайну сторінку налаштувань і все одно тримати свій секретний ключ у файлі, який може відкрити будь-хто. Щоб відповісти, треба прочитати ключ, який насправді лежить у застосунку.

У новому проєкті прочитайте перші символи. sb_publishable_ це той, якому там місце. sb_secret_ це той, яким треба зайнятися сьогодні.

У старому проєкті доведеться зазирнути всередину ключа. anon і service_role це JWT: три блоки, розділені крапками, і середній блок розкодовується у звичайний читабельний текст. У ньому є поле role, і це єдине слово становить усю різницю між ними. Як його прочитати.

Панель показує, які ключі існують. Який із них узяв ваш застосунок, може відповісти тільки сам застосунок.

Якщо ви не хочете перебирати застосунок руками, наше безкоштовне сканування читає ваш живий сайт іззовні й називає ключі, які бачить, а також те, чи відповідають ваші таблиці незнайомцеві, який питає. Це триває близько 20 секунд і не потребує акаунта: просканувати застосунок.

А якщо секретний ключ уже в застосунку?

Розберіться із самим ключем, перш ніж торкатися коду, і в Supabase це може означати не те, чого ви чекаєте.

Звична порада це ротувати: створити новий ключ, відкликати старий, і значення, яке витекло, перестає працювати. Для нових ключів це й досі так. Проєкт може тримати кілька ключів sb_secret_ одночасно й відкликати їх по одному, тож заміна одного більше не означає хвилини, коли все, що ним користувалося, зламане.

Для початкової пари це не працює зовсім. Власні нотатки Supabase з усунення несправностей кажуть, що ротувати старі секрети anon, service_role і JWT більше неможливо. Зробити старий ключ service_role, який витік, непридатним означає створити нові ключі, перевести застосунок і серверний код на них, а вже тоді вимкнути стару пару. Що саме передбачає ця міграція, це кілька кроків у панелі й одне замінене значення у застосунку, і робити це спокійного дня значно легше, ніж у день, коли воно вам знадобилося.

Що робити зараз

Що робити

  • Відкрийте Settings → API Keys у своєму проєкті. Якщо не можете знайти проєкт, візьміть референс із https://yourreference.supabase.co і звірте його зі списком у панелі.
  • Покладіть у застосунок URL проєкту і публічний ключ. Ці два, і більше нічого.
  • Прочитайте ключ, який ваш застосунок узяв насправді. sb_secret_ спереду або "role": "service_role" усередині старого це та знахідка, якою слід зайнятися сьогодні.
  • Якщо секретний ключ у вашому фронтенді, зробіть його непридатним, перш ніж щось редагувати. У старому проєкті це означає створити нові ключі й вимкнути стару пару, і однієї кнопки для цього немає.
  • Загляньте в Row Level Security, доки ви й так у панелі. Публічний ключ безпечний лише завдяки цим правилам, а без них він читає всю вашу базу.

Якщо вам зручніше пройти це списком, 10-хвилинний чекліст безпеки охоплює і це, і решту речей, які варто вимкнути в щойно запущеному застосунку, а ще ми маємо покрокову інструкцію простою мовою для застосунків на Supabase.

Поширені запитання

Де в Supabase лежить ключ service_role?

У панелі, всередині вашого проєкту, у розділі Settings → API Keys. У старому проєкті він підписаний як service_role і схований за кнопкою показу, у новому це секретний ключ, що починається з sb_secret_. Старіші інструкції називають ту саму сторінку Settings → API.

Який вигляд має ключ anon у Supabase?

У новому проєкті це довгий рядок, що починається з sb_publishable_. У старому це JWT: три блоки символів, розділені крапками, які починаються з eyJ, загалом кілька сотень символів. Ключ service_role має точно такий самий вигляд, і саме тому їх плутають.

Чи є URL мого проєкту в Supabase таємницею?

Ні. Це адреса, на яку ваш застосунок надсилає кожен запит, тож вона за задумом потрапляє до кожного відвідувача, і немає версії застосунку, де вона схована. Знайти її не означає щось знайти. Чи зможе незнайомець прочитати ваші дані, вирішує Row Level Security, а не те, чи знає він вашу адресу.

Застосунок зробили за мене, і я жодного разу не відкривав Supabase. Як туди зайти?

Спершу знайдіть референс проєкту: короткий випадковий рядок в адресі, яку ваш застосунок і так викликає, https://yourreference.supabase.co. Білдери підключають Supabase через ваш власний акаунт, тож проєкт зазвичай лежить у панелі, до якої ви колись зареєструвалися й ніколи нею не користувалися. Увійдіть на supabase.com із цим акаунтом і звірте референс зі списком проєктів.

Чи можна ротувати ключ service_role, який витік?

Лише якщо це один із нових ключів sb_secret_, яких можна тримати кілька і відкликати по одному. Supabase повідомив, що ротувати старі секрети anon, service_role і JWT більше неможливо. Тому зробити старий ключ, який витік, непридатним означає створити нові ключі, перевести застосунок і серверний код на них, а вже тоді вимкнути стару пару.

Що таке SUPABASE_SERVICE_ROLE_KEY?

Це ім'я змінної середовища, під яким ваш код тримає секретний ключ, той самий, що на старішому проєкті зветься service_role, а на новішому sb_secret_. Його місце лише в серверній конфігурації: edge function, обробник вебхука, запланована задача. Усе з префіксом VITE_ або NEXT_PUBLIC_ компілюється у браузерний бандл, тож ключ service_role за таким іменем стає публічним у мить деплою.

Автор

Vlad Tkachenko

Засновник Reeve

Я щодня дивлюся на застосунки, зібрані в Lovable, Bolt, v0, Cursor і Replit, і на короткий список помилок, які трапляються в них знову і знову.

Більше про автора

Читати далі

Усі статті

Не впевнені, як справи у вашому застосунку?

Запустіть безкоштовне сканування й отримайте зрозумілу оцінку від A до F приблизно за 20 секунд. Без облікового запису й без картки.

Сканувати безкоштовно

Автоматична зовнішня перевірка, а не повний аудит. Відсутність знахідок не є гарантією безпеки.