SDK Frame.io для TypeScript — руководство по аутентификации
SDK Frame.io для TypeScript — руководство по аутентификации
В этом руководстве объясняется, как выполнять аутентификацию с помощью API-интерфейса Frame.io, используя SDK Frame.io для TypeScript (frameio). API-интерфейс Frame.io V4 использует службу Adobe Identity Management Service (IMS) — платформу идентификации Adobe на базе протокола OAuth 2.0. Это отдельное справочное руководство для разработчиков TypeScript/JavaScript. Все приведенные ниже примеры кода и рабочие процессы относятся исключительно к пакету frameio.
Типы аутентификации в SDK для TypeScript
SDK для TypeScript поддерживает четыре класса аутентификации OAuth, а также прямое использование токенов.
Пользователи сервисных учетных записей
При использовании межсерверной аутентификации ваше приложение выступает в роли пользователя сервисной учетной записи — отдельного типа учетной записи, которая может выполнять действия от имени сервиса. Эти действия видны другим пользователям в Frame.io: когда сервисная учетная запись выполняет какое-либо действие, ее имя отображается в интерфейсе. Вы можете предоставлять и отзывать права доступа сервисных учетных записей через Adobe Admin Console и Developer Console. Управление именами сервисных учетных записей осуществляется через интерфейс Frame.io. По умолчанию ваше первое межсерверное подключение (S2S) называется Service Account User, второе — Service Account User 2 и так далее.
Подробнее — в разделе Автоматизация настройки с помощью межсерверной поддержки Frame.io.
Быстрый старт
Предварительные требования
- Учетные данные из Adobe Developer Console
- Client ID — требуется для всех процессов OAuth - секретный ключ клиента — требуется для процессов S2S и веб-приложения - URI перенаправления — требуется для процессов веб-приложения, одностраничного (SPA) и встроенного приложений; должен быть зарегистрирован в вашем проекте Adobe
- Установка SDK
Выбор метода
- Пользователь не участвует? Используйте межсерверную аутентификацию (
ServerToServerAuth). - Пользователь участвует и вы можете хранить секретный ключ? Используйте веб-приложение (
WebAppAuth). - Пользователь участвует, но вы не можете хранить секретный ключ? Используйте одностраничное приложение (
SPAAuth) для веб-версий в браузере или встроенное приложение (NativeAppAuth) для ПК и мобильных устройств.
Токен доступа
Если у вас уже есть токен доступа, полученный из другой системы OAuth или в результате предыдущего обмена (например, через наш API-интерфейс Explorer), вы можете передать его напрямую.
Это самый простой подход, но срок действия токена со временем истечет, и SDK не будет обновлять его автоматически.
Устаревшие токены разработчика
Для учетных записей, переведенных на версию V4, которые еще не управляются через Adobe Admin Console, можно продолжать использовать устаревшие токены разработчика с сайта Frame.io Developer. При этом необходимо добавить заголовок x-frameio-legacy-token-auth и установить его значение на true.
Устаревшие токены разработчика не истекают, но они являются переходным механизмом. Для новых интеграций и производственных нагрузок мы рекомендуем использовать один из приведенных ниже процессов OAuth 2.0. Подробнее — в руководстве по миграции.
Межсерверная аутентификация (учетные данные клиента)
Используйте этот метод для серверных сервисов и сценариев, которым нужен доступ к Frame.io без участия пользователя. Этот процесс доступен только для учетных записей Frame.io V4, управляемых через Adobe Admin Console. Ваше приложение проходит аутентификацию как пользователь сервисной учетной записи без участия человека.
Готово. auth.getToken() — это асинхронная функция, которую SDK запускает при каждом запросе. Если текущий токен все еще действителен, он возвращается мгновенно. Если срок его действия подходит к концу, метод сначала запрашивает новый токен без всякого вашего участия.
Как это работает
Ваши учетные данные клиента (идентификатор клиента + секретный ключ) не имеют срока действия. Вы меняете их только вручную в целях безопасности. Метод S2S обеспечивает фактически бессрочный и бесперебойный доступ к API-интерфейсу без какого-либо ручного вмешательства.
Архитектура процесса
- При первом вызове API-интерфейса метод
getToken()запрашивает новый токен доступа от Adobe IMS, используя тип разрешенияclient_credentials. - Токен кэшируется в памяти. Срок действия отдельных токенов доступа ограничен (обычно 24 часа), но SDK берет управление этим процессом на себя.
- При попадании кэшированного токена в буфер обновления (по умолчанию за 60 секунд до истечения) SDK автоматически получает новый токен, используя те же учетные данные клиента.
- Токены обновления не используются. Сами учетные данные клиента являются долговременным секретным ключом, который всегда можно использовать для выпуска нового токена доступа.
Явная аутентификация
Если вы хотите получить токен заранее (например, чтобы быстро выявить ошибку на этапе запуска, если учетные данные неверны), используйте следующий метод.
Веб-приложение (код авторизации)
Используйте этот метод для серверных приложений, в которых пользователи выполняют вход с помощью Adobe ID. В этом процессе требуется секретный ключ клиента, который должен безопасно храниться на вашем сервере.
Обработка обратного вызова
Когда Adobe IMS перенаправляет пользователя обратно на ваш redirectUri, извлеките параметры code и state. Убедитесь в соответствии состояния тому, что вы сохранили, затем обменяйте код на токены.
Этот процесс производит обмен кода авторизации на токен доступа и токен обновления, сохраняя их оба во внутренней памяти.
Полный пример для Express
Одностраничное приложение / PKCE (код авторизации + PKCE)
Используйте этот метод для браузерных приложений, программ для ПК или инструментов командной строки (CLI), которые не могут безопасно хранить секретный ключ клиента. В этом процессе используется расширение PKCE (RFC 7636), чтобы защитить обмен кода авторизации.
Создание URL-адреса авторизации
Метод getAuthorizationUrl возвращает объект AuthorizationUrlResult, содержащий полный URL-адрес (с встроенной строкой PKCE code_challenge) и строку codeVerifier, которая понадобится вам на следующем шаге.
Ключ codeVerifier должен надежно храниться на стороне клиента в промежутке между запросом авторизации и обменом кода. Используйте хранилище sessionStorage или аналогичный механизм в браузерных приложениях.
Встроенное приложение (код авторизации + PKCE)
Используйте этот метод при работе с приложениями для ПК и мобильных устройств. При создании учетных данных встроенного приложения в Adobe Developer Console Adobe назначает вам URI перенаправления вида adobe+<hash>://callback</hash>. Вам необходимо зарегистрировать свое приложение для обработки этой пользовательской схемы URI на уровне операционной системы. Перенаправление на локальный адрес (http://127.0.0.1:<port>/callback</port>) также поддерживается при локальной разработке. Процесс идентичен одностраничному приложению: в нем используется PKCE без секретного ключа клиента.
Правила URI перенаправления
Adobe применяет правила проверки URI перенаправления в двух точках: когда вы регистрируете учетные данные в Adobe Developer Console и когда параметр redirect_uri достигает конечной точки /authorize/v2. Значение, которое вы передаете в redirectUri внутри SDK, должно соответствовать одному из шаблонов URI перенаправления, заданных в ваших учетных данных. В противном случае Adobe перенаправит пользователя на адрес по умолчанию.
- Учетные данные в процессах веб-приложения и одностраничного приложения требуют использования протокола HTTPS.
- Учетные данные в процессах встроенного приложения используют перенаправление без HTTPS — обычно это URI вида
adobe+<hash>://callback</hash>, указанный для этих данных в Developer Console.
Точные шаблоны, поддерживаемые вашими учетными данными, можно посмотреть в Adobe Developer Console.
В состав SDK для Python не входит класс учетных данных для встроенных приложений, поскольку в Python нет стандартного способа регистрации обработчиков
пользовательских схем URI. SDK для TypeScript поддерживает все четыре типа учетных данных, включая данные для встроенного приложения.
Ручное обновление токена
В процессах веб-приложения, SPA и встроенного приложения SDK обновляет токены автоматически с помощью метода getToken(). Если вам нужен явный контроль над этим процессом, вы можете вызвать метод refresh() напрямую.
Это полезно, когда нужно принудительно обновить токен перед выполнением критически важной операции, вместо того чтобы полагаться на автоматический буфер обновления.
Метод refresh() доступен в классах WebAppAuth, SPAAuth и NativeAppAuth. Он выдает ошибку ConfigurationError, если токен обновления отсутствует (то есть сначала нужно вызвать exchangeCode()). В процессе ServerToServerAuth метод refresh() отсутствует — вместо этого для получения нового токена через учетные данные клиента используется метод authenticate().
Сохранение токенов
Все классы аутентификации поддерживают методы exportTokens() и importTokens() для сохранения состояния токенов между перезапусками приложения. Для процессов веб-приложения, одностраничного и встроенного приложений это особенно важно, поскольку токены доступа и обновления по умолчанию хранятся в памяти. Если ваше приложение перезапустится, пользователям придется проходить аутентификацию заново, если только вы не сохранили токены. Для межсерверной аутентификации сохранение необязательно (учетные данные клиента всегда могут выпустить новый токен), но импорт кэшированного токена позволяет избежать лишнего цикла запроса-ответа при запуске.
Экспорт и импорт
Экспортированные токены должны храниться в безопасности. Они содержат токены доступа и обновления, которые предоставляют доступ к API-интерфейсу. Избегайте записи токенов
в текстовые файлы в производственной среде.
Автоматическое сохранение с помощью функции onTokenRefreshed
Чтобы автоматически сохранять токены при каждом их обновлении, используйте функцию обратного вызова onTokenRefreshed.
Функция обратного вызова принимает словарь того же формата, что и exportTokens(), и срабатывает после каждого успешного обновления токена.
Отзыв токенов
Чтобы выполнить выход пользователя из системы и аннулировать его токены в Adobe IMS, используется следующий метод.
Этот метод отправляет в Adobe IMS два параллельных запроса на аннулирование токенов по принципу наилучших усилий (один — для токена доступа, второй — для токена обновления), а затем очищает все локальные данные о состоянии токенов. Для конфиденциальных клиентов (WebAppAuth) запросы на аннулирование токенов используют базовую HTTP-аутентификацию, а для публичных клиентов (SPAAuth, NativeAppAuth) в строке запроса передается параметр client_id. Ошибки отзыва регистрируются в журнале, но не генерируют исключение. После отзыва токенов пользователю потребуется пройти аутентификацию заново.
Обработка ошибок
Все ошибки аутентификации наследуются от FrameioAuthError, поэтому вы можете перехватывать их в общем блоке или обрабатывать конкретные случаи отдельно.
Справочник по ошибкам
Обработка истекших токенов обновления в производстве
В процессах веб-приложения, одностраничного и встроенного приложений срок действия токена обновления со временем истекает. Когда это происходит, метод getToken() генерирует исключение TokenExpiredError. Вам следует перехватить эту ошибку и перенаправить пользователя на повторное прохождение процедуры авторизации.
Справочник по конфигурации
Эти параметры имеют разумные значения по умолчанию и редко требуют настройки. Если вам все же необходимо изменить поведение SDK, например перенаправить запросы в тестовую среду IMS, внедрить пользовательскую функцию fetch, настроить время ожидания или подключить логгер, передайте любой из них как необязательный параметр при создании класса авторизации.
Тестовые среды
Чтобы перенаправить запросы на тестовый экземпляр Adobe IMS, переопределите параметр imsBaseUrl. SDK также экспортирует константу DEFAULT_IMS_BASE_URL (https://ims-na1.adobelogin.com) если вам необходимо программно ссылаться на значение, используемое в производственной среде.
Пользовательская функция fetch
Для поддержки прокси или пользовательской конфигурации TLS используйте следующий метод.
Безопасность при параллельном использовании
SDK для TypeScript безопасен при параллельном использовании. Если одновременно происходит несколько вызовов метода getToken() в момент, когда требуется обновление токена, выполняется только один запрос на обновление. Остальные вызовы ожидают выполнения этого же промиса и получают идентичный результат. Никаких внешних механизмов блокировки не требуется. Такое устранение дубликатов реализуется за счет однопоточного цикла событий JavaScript и общего промиса Promise. Если запрос на обновление уже выполняется, параллельные вызовы просто подключаются к нему вместо выполнения повторного запроса. Если метод revoke() вызывается в момент, когда выполняется обновление токена, процесс обновления отклоняется с ошибкой AuthenticationError, а токены удаляются — операция отзыва всегда имеет наивысший приоритет.