Аккаунты, токены и способы авторизации#
Аккаунт#
Аккаунт необходим для разграничения областей видимости объектов для конкретного пользователя. Наличие аккаунта требуется для выполнения большинства запросов. Каждый созданный аккаунт имеет свой собственный уникальный идентификатор "account_id". Все данные аккаунтов сохраняются в БД сервиса Accounts под этим идентификатором.
Аккаунт можно создать с помощью POST запроса "create account" к сервису API, либо с помощью сервиса Admin. При создании аккаунта необходимо указать следующие данные: электронная почта (login), пароль (password) и тип аккаунта (account_type).
Тип аккаунта#
Тип аккаунта определяет, какие данные доступны пользователю.
Существует три типа аккаунтов:
- user — тип аккаунта, с помощью которого можно создавать объекты и использовать только данные своего аккаунта.
- advanced_user — тип аккаунта, для которого доступны права, аналогичные "user", а также есть доступ к данным всех аккаунтов. Доступ к данным других аккаунтов означает возможность получать данные (запросы GET), проверять их наличие (запросы HEAD) и выполнять запросы на сравнение по данным других аккаунтов.
- admin — тип аккаунта, для которого доступны права, аналогичные "advanced_user", а также есть доступ к сервису Admin.
В сервисе API можно работать со всеми типами аккаунтов, но создать можно только аккаунты типа "advanced_user" и "user", в то время как в сервисе Admin можно создать все три типа.
По умолчанию в системе существует аккаунт типа "admin" и логином и паролем по умолчанию root@visionlabs.ai
/root
.
С помощью заголовка "Luna-Account-Id" в запросе "create account" можно задать желаемый идентификатор аккаунта. Также его необходимо использовать в случае, если необходимо сохранить возможность работы с данными, созданными в версиях LP до 5.30.0 с помощью указания идентификатора "account_id" в заголовке "Luna-Account-Id". Таким образом, использование данного параметра привяжет старый "account_id" к создаваемому аккаунту (см. подробную информацию о миграции в разделе "Миграция аккаунтов" в руководстве по обновлению LUNA PLATFORM).
В ответе на запрос на создание аккаунта выдается "account_id". После создания аккаунта можно использовать этот идентификатор для авторизации LunaAccountIdAuth или использовать авторизацию авторизацию BasicAuth (авторизация по по логину/паролю).
Токен#
Токен привязывается к существующему аккаунту с любым типом ("user", "advanced_user", "admin") и позволяет наложить расширенные ограничения на выполняемые запросы. Например, при создании токена можно дать пользователю разрешение только на создание и изменение всех списков и лиц, или можно запретить использование определенных обработчиков, указав их идентификатор.
Токен создается с помощью запроса "create token" к сервису API.
Для каждого аккаунта можно создать неограниченное количество токенов. Токен и все его ограничения сохраняются в БД и привязываются к аккаунту по параметру "account_id". Нельзя привязать один токен к разным аккаунтам. Для создания токенов с одинаковыми разрешениями в рамках разных аккаунтов рекомендуется сохранить шаблон тела запроса для создания аккаунта и использовать его.
Нет необходимости в использовании и токена и аккаунта. При работе с токенами можно ограничить доступ к ресурсу "/accounts" с помощью внешних средств.
Для токена в любой момент можно выдать дополнительные ограничения с помощью запроса "replace token" или можно отозвать токен с помощью запроса "delete token". В этом случае токен будет удален из БД и больше не может быть использован для авторизации.
При создании токена требуется задать следующие параметры:
— expiration_time – время окончания действия токена в формате RFC 3339. Можно указать бесконечное время действия токена с помощью значения "null" — permissions – действия, которые может выполнять пользователь (см. "Разрешения, задаваемые в токене")
Для токена также возможно указать видимость токеном данных других аккаунтов с помощью параметра "visibility_area" (см. раздел "Просмотр данных других аккаунтов").
В ответе на запрос на создание токена выдается "token_id" и закодированный в Base64 JWT токен. После создания токена можно использовать полученный JWT токен для авторизации BearerAuth.
Разрешения, задаваемые в токене#
Для создаваемого токена доступны следующие разрешения:
Название разрешения | Описание разрешения | Права |
---|---|---|
account | права на использование аккаунта | view |
face | права на использование лица | creation, view, modification, deletion, matching |
list | права на использование списка | creation, view, modification, deletion |
event | права на использование события | creation (только запрос "save event"), view, matching |
attribute | права на использование атрибута | creation, view, modification, deletion, matching |
handler | права на использование обработчика | creation, view, modification, deletion |
verifier | права на использование верификатора | creation, view, modification, deletion |
task | права на использование задачи и расписания задачи | creation, view, modification, deletion |
face_sample | права на использование БО лица | creation, view, deletion |
body_sample | права на использование БО тела | creation, view, deletion |
object | права на использование объекта | creation, view, deletion |
image | права на использование изображения | creation, view, deletion |
token | права на использование токена | view, modification, deletion |
resources | права на использование ресурсов | "/iso", "/sdk", "/liveness" |
emit_events | права на выполнение запросов "generate events" | (см. ниже) |
lambdas | права на использование lambda | creation, view, modification, deletion |
verify | права на выполнение запросов "perform verification" | (см. ниже) |
video_stream | права на использование потоков | creation, view, modification, deletion |
video_group | права на использование групп | creation, view, modification, deletion |
video_analytic | права на просмотр аналитик | view |
пользовательское | пользовательские права | creation, view, modification, deletion |
Пользовательские права предназначены для проксирования запросов LUNA Streams через LUNA API. В остальных случаях использование пользовательских прав не будет иметь эффекта. См. раздел "Проксирование запросов в LUNA Streams через LUNA API" в руководстве администратора FaceStream.
Ресурсы "/iso", "/sdk" и "/liveness" по умолчанию не требуют никакой авторизации.
Значение [] означает отсутствие всех разрешений.
Разрешения "emit_events" и "verify" позволяют указать можно ли выполнять запросы к ресурсу "generate events" или "perform verification", а также поместить идентификаторы обработчиков или верификаторов в черный или белый списки. Если идентификаторы "handler_id" или "verifier_id" присутствуют в черном списке, то только их использование будет запрещено. Если же идентификаторы присутствуют в белом списке, то только их использование будет разрешено. Максимальное количество идентификаторов в списках — 100. При использовании разрешения "emit_events" у пользователя не должно быть прав "creation" и "modification" на использование обработчика.
Если выдано разрешение "emit_events", то во время генерации события будут созданы все необходимые объекты независимо от разрешений, задаваемых в токене. Например, разрешение типа "faces" регулирует работу с лицами только в запросах к ресурсам "faces/*", но не влияет на создание лица во время генерации события. Таким образом, при использовании обработчика с параметром "store_face" и отсутствии права "creation" для "faces", все равно будет создано лицо.
Если выдано разрешение "verify", то во время выполнения верификации будут созданы все необходимые объекты независимо от разрешений, задаваемых в токене. Например, разрешение типа "sample" не влияет на создание биометрического образца во время выполнения верификации. Таким образом, при использовании верификатора с параметром "store_sample" и отсутствии права "creation" для "samples", все равно будет создан биометрический образец.
При задании разрешений следует учитывать следующие особенности:
- тип "modification" означает выполнение PATCH и PUT запросов
- прикрепление/открепление к списку является разрешением типа "modification"
- удаление списка с включенной настройкой "with_faces" (запрос "delete lists") требует разрешения "face" > "deletion"
- прикрепление лица к списку в запросе на создания лица (запрос "create face") требует разрешения "list" > "modification"
- при выполнении сравнения необходимо иметь разрешение "matching" для соответствующих объектов (event, face, attribute)
- запросы на получение статистики по событиям (запрос "get statistics on events") требуют разрешения "event" > "view"
- разрешение "event" > "create" дает право только на создание события с помощью запроса "save event". Для генерации события необходимо воспользоваться разрешением "emit_events" (см. выше)
- разрешение "event" > "create" не распространяется на верификаторы
См. таблицу зависимости разрешений токенов от ресурсов сервиса API в руководстве разработчика.
Просмотр данных других аккаунтов#
Данные другого аккаунта могут быть просмотрены если:
- тип аккаунта установлен как "advanced_user" или "admin"
- при создании токена был указан параметр "visibility_area" = "all".
Для типа аккаунта "user" нельзя задать "visibility_area" = "all".
Если установлен тип аккаунта "advanced_user"/"admin" и создается токен с установленным параметром "visibility_area" = "account", то при авторизации по токену (BearerAuth) пропадет возможность смотреть данные других аккаунтов, однако при авторизации по логину/паролю (BasicAuth), такая возможность останется.
Если установлен тип аккаунта "advanced_user"/"admin" и создан токен с установленным параметром "visibility_area" = "all", а затем тип аккаунта изменяется на "user" (с помощью запроса "patch account"), то при попытке выполнить запрос на просмотр данных других аккаунтов с помощью токена будет выдана ошибка.
При использовании авторизации LunaAccountIdAuth область видимости регулируется с помощью заголовка "Luna-Account-Id", что означает, что видны только данные аккаунта, связанного с этим идентификатором.
Для верификаторов недоступна возможность использования области видимости данных всех аккаунтов. При значении параметра "visibility_area" = "all", будет видны данные только своего аккаунта.
Типы авторизации для доступа к ресурсам#
В LUNA PLATFORM доступно три типа авторизации:
- BasicAuth. Авторизация по логину и паролю (задаются во время создания аккаунта).
- BearerAuth. Авторизация по JWT токену (выдается после создания токена).
- LunaAccountIdAuth. Авторизация по заголовку "Luna-Account-Id", в котором указывается сгенерированный после создания аккаунта "account_id". Данный способ считается устаревшим и не рекомендуется к использованию.
Авторизация LunaAccountIdAuth может быть включена с помощью настройки "ALLOW_LUNA_ACCOUNT_AUTH_HEADER" в секции "OTHER" настроек сервиса API в Configurator (по умолчанию отключена).
В спецификации OpenAPI заголовок "Luna-Account-Id" помечен словом Deprecated.
Нет необходимости в использовании всех трех типов авторизации при выполнении запросов. Необходимо выбрать предпочтительный способ в зависимости от требуемых задач.
Если в запросе не указан тип авторизации, будет выдаваться ошибка с кодом состояния 403.
Проверка актуальности учетной записи#
С помощью ресурса "verify credentials" можно проверять существующие учетные записи по одному из типов:
- верификация логина/пароля. Если верификация успешна – вернется идентификатор аккаунта и его тип.
- верификация токена. Если верификация успешна, вернется тип аккаунта и все разрешения для токена.
- верификация идентификатора аккаунта. Если верификация успешна – вернется тип аккаунта.
Логирование информации об аккаунтах#
При выполнении любого запроса, в логах сервиса API выводится информация о соответствующем аккаунте. Данный функционал позволяет определить кто именно выполнил тот или иной запрос. Это может потребоваться для информационной безопасности и администраторов систем.
Если запрос был выполнен с авторизацией типа BasicAuth или LunaAccountIdAuth, то в логах будет выдано следующее сообщение:
Request invoked by user (account_id: '270531af-e52e-4538-9181-628d9900a0db')
Если запрос был выполнен с авторизацией типа BearerAuth, то в логах будет выдано следующее сообщение:
Request invoked by user (account_id: '270531af-e52e-4538-9181-628d9900a0db' token_id: 'd57e16f5-e243-47d2-aa85-8b200c12d86f')
Если запрос был выполнен без авторизации, то в логах будет выдано следующее сообщение:
Request invoked by user (account_id: null)
В логах сервиса Accounts дополнительно выводится информация о создании токенов конкретными пользователями:
User with account_id: '270531af-e52e-4538-9181-628d9900a0db' create token: 'd57e16f5-e243-47d2-aa85-8b200c12d86f'
Логирование информации о создании токенов позволяет отследить откуда появился токен и какому пользователю он принадлежал, даже после его удаления.