Найкращі практики створення безпечних ключів API

Ми всі знаємо, наскільки цінні API. Вони - шлюз для вивчення інших служб, інтеграції з ними та швидшого створення чудових рішень.

Можливо, ви створили або думаєте створити API для використання іншими розробниками. API потрібна певна форма аутентифікації для надання авторизованого доступу до даних, які він повертає.

Сьогодні доступно кілька стандартів аутентифікації, такі як API ключі, OAuth, JWT тощо.

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

Так чому API ключі?

Клавіші API прості у використанні, вони короткі, статичні та не закінчуються, якщо їх не скасовано. Вони забезпечують простий спосіб спілкування з багатьма послугами.

Якщо ви надаєте API для споживання клієнтами, вам важливо будувати його правильно.

Почнемо, і я покажу, як правильно створити ключі API.

Генерація ключів API

Оскільки ключ API сам по собі є ідентичністю, за допомогою якої можна ідентифікувати додаток або користувача, він повинен бути унікальним, випадковим і не підлягає догадуванню. Згенеровані ключі API також повинні використовувати буквено-цифрові та спеціальні символи. Прикладом такого ключа API є zaCELgL.0imfnc8mVLWwsAawjYr4Rx-Af50DDqtlx.

Безпечне зберігання ключів API

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

Подумай над цим. Причиною, що нам потрібно зберігати ключі API, є переконання, що ключ API у запиті є дійсним та виданий нами (як і пароль).

Нам не потрібно знати необроблений ключ API, а просто перевірити правильність ключа. Отже, замість того, щоб зберігати ключ у простому тексті (неправильно) або шифрувати його, ми повинні зберігати його як хешоване значення у нашій базі даних.

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

У наведеному вище коді первинним ключем буде комбінація префікса та хеша ключа API {prefix}. {Hash_of_whole_api_key}.

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

Представлення ключа API для користувачів

Оскільки ми не зберігаємо оригінальний ключ API, ми можемо показати його лише один раз користувачеві під час створення. Тому не забудьте попередити користувачів про те, що його неможливо отримати знову, і їм потрібно створити новий маркер, якщо вони забудуть скопіювати ключ API та зберегти його безпечно. Ви можете зробити щось подібне:

Відображення згенерованого ключа API з повідомленням попередження

Як користувачі можуть пізніше визначити створений ключ API

Інша проблема полягає в тому, як користувачі ідентифікують правильний ключ API у вашій консолі, якщо їм потрібно відредагувати або відкликати його. Це можна вирішити, додавши префікс до ключа API. Зауважте на малюнку над першими 7 символами (це наш префікс), розділеними крапкою.

Тепер ви можете зберігати цей префікс у базі даних та відображати його в консолі, щоб користувачі могли швидко визначити правильний запис ключа API, наприклад, такий:

Консоль управління ключем API

Не дайте API Key усі сили

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

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

Наприклад,

  • якщо вам потрібен ключ API для просто надсилання електронних листів, ви можете створити ключ API з областю "email.send"
  • якщо кінцевий користувач має декілька серверів і кожен здійснює певну дію, то окремий ключ API може бути створений із певним обсягом.

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

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

Суб'єкт бази даних API Key

Обмежування кількості ключів API

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

Висновок

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

Приємно забезпечити свої API!