Перевод: API-ключи и токены - в чем разница?

Перевод: API-ключи и токены - в чем разница?

@Ent_TranslateIB

Говорят, что две самые сложные проблемы в информатике - это аннулирование кэша и именование вещей. Честно говоря, это не так уж и плохо. Это очень сложно.‍

Что делает именование вещей сложным, так это четкость и в то же время краткость. Не должно быть никаких сомнений в значении переменной, термина, функции или класса. Если вы думаете, что термин может означать одно из двух, значит, он назван неправильно.‍

Так обстоит дело с ключами и токенами API. На днях я участвовал в дискуссии, где эти два слова использовались как взаимозаменяемые. Примерно через две минуты мне пришлось прервать разговор и сказать: «Вы же знаете, что это разные вещи, верно?"‍.

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

Определение

Мы можем провести различие между API-ключом и токеном с помощью следующих определений:

  • API-ключ - значение, предоставляемое кодом при вызове API для идентификации и авторизации вызывающей стороны. Он предназначен для программного использования и часто представляет собой длинную строку букв и цифр.
  • Токен - фрагмент данных, представляющий пользовательскую сессию или определенные привилегии. Используется отдельными пользователями в течение ограниченного периода времени.

Генерация

Метод создания также обычно различается.

  • API-ключ - создается один раз, часто через пользовательский интерфейс, и остается статичным до момента ротации. При желании можно настроить его на истечение определенного времени.
  • Токен - генерируется динамически при успешной аутентификации или входе в систему. Часто имеет короткий срок действия, но может обновляться в течение более длительного времени.

Область применения

Обсуждение аутентификации невозможно без обсуждения области действия разрешения. Под областью действия разрешения я подразумеваю часть авторизации или то, какие функции могут быть выполнены при использовании предоставленного метода авторизации.

  • API-ключ - фиксированный, неизменный набор разрешений на возможности приложения. Тот, у кого есть ключ, может получить доступ к разрешенным ресурсам.
  • Токен - ограниченный набор данных или возможностей, к которым имеет доступ человек. Это может зависеть от ролей или других требований на уровне бизнеса. Как правило, больше ориентирован на ограничение данных.

Безопасность

Насколько безопасен каждый метод? Если ключ или токен будет скомпрометирован или получен злоумышленником, насколько велик потенциальный ущерб?

  • API-ключ - поскольку они, как правило, долговечны и не ограничивают доступ к данным, их компрометация может оказаться губительной. Они требуют отзыва ключа как единственного средства решения проблемы. Приложениям часто требуется хорошая наблюдаемость для выявления скомпрометированных ключей и поиска злоумышленника.
  • Токен - разработан с учетом требований безопасности. Как правило, недолговечны и легко отзываются. Скомпрометированный токен будет иметь доступ только к тем данным, к которым имеет доступ пользователь, и срок его действия истечет автоматически.

Варианты использования

Итак, в каких случаях вы можете использовать один из них вместо другого? Похоже, что они имеют хороший баланс плюсов и минусов.

  • API-ключ - используется для связи между серверами, доступа к публичным данным, например к API погоды, интеграции с системами сторонних производителей.
  • Токен - используется для аутентификации пользователей, тонкого контроля доступа (FGAC), предоставления временного доступа к ресурсам, доступа к браузеру и управления пользовательскими сессиями.

Примеры

Теперь, когда мы понимаем разницу между этими двумя понятиями, давайте рассмотрим два практических примера с использованием Momento JavaScript SDK.

Ключи API

Я уже говорил, что API-ключи обычно выдаются через пользовательский интерфейс. В связи с этим у меня нет примера кода, которым можно было бы поделиться. Однако ниже показано, как можно получить API-ключ через консоль Momento в качестве пользователя.‍

Вы выбираете необходимые разрешения, устанавливаете дату истечения срока действия и создаете ключ. После этого вы можете сразу же использовать API-ключ в своих рабочих процессах.

Токены

Напротив, одноразовый токен, основанный на пользователе, выдается при успешном входе в систему. Мы можем взять пример с ролью пользователя, который получает доступ к кэшу событий календаря только для чтения, но имеет доступ к публикации и подписке на темы для совместной работы.‍

// called on successful login
exports.handler = async (event) => {
  const user = await loadUserMetadata(event.userId);
  let token;
  switch(user.role){
    case 'data-entry': 
       token = await getDataEntryToken(user.tenantId);
        break;
    case 'admin':
      token = await getAdminToken(user.tenantId);
      break;
    default:
      throw new Error('Role not supported');
  }

  return token;
};

const getDataEntryToken = async (tenantId) => {
  const scope = {
    permissions: [
      {
        role: 'readonly',
        cache: 'calendar-events',
        item: {
          keyPrefix: tenantId
        }
      },
      {
        role: 'publishsubscribe',
        cache: 'collaboration',
        topic: `${tenantId}-events`
      }
    ]
  };

  const response = await authClient.generateDisposableToken(scope, ExpiresIn.minutes(15));
  return {
    token: response.authToken,
    expiresAt: response.expiresAt.epoch()
  };
};

Здесь видно, что мы создаем токен, действующий в течение 15 минут, с правами только на чтение для возможностей и разрешаем доступ только к тем элементам кэша, которые начинаются с идентификатора tenantId, к которому принадлежит пользователь. Таким образом, мы ограничили как функциональность, так и данные на основе атрибутов пользователя.

Основные выводы

API-ключи и токены имеют свои плюсы и минусы. Один не лучше другого. Как и во всех других областях информатики, все зависит от вашего сценария использования. Принимая решение о том, какой механизм авторизации вы собираетесь реализовать, подумайте о том, как ваши пользователи будут взаимодействовать с вашим приложением.‍

Это пользовательские сессии в Интернете? Выбирайте токены. Может быть, вы ожидаете только программный доступ, и вам не нужно определять, какие данные доступны. Тогда используйте API-ключи. Не стесняйтесь сохранить нашу справочную таблицу вверху для быстрого ознакомления.‍

Независимо от того, какой путь вы выберете, помните, что ваши данные должны быть в безопасности. Никто не хочет, чтобы утечка данных вывела их из бизнеса. Будьте осторожны.‍

Если вас интересует, как начать работу с Momento, и вам нужна помощь в определении уровня контроля доступа, вы всегда можете зайти в наш Discord и задать вопрос команде напрямую. Если вы больше любите читать, то документация для разработчиков доступна 24 часа в сутки 7 дней в неделю. ‍

Счастливого кодинга!‍

Оригинал статьи - здесь.
Поддержите автора хлопками на Medium.


Перевод статьи был выполнен проектом перевод энтузиаста:

  • 📚 @Ent_TranslateIB - Телеграмм канал с тематикой информационной безопасности

Report Page