Сервис "Реестр ключей"¶
Сервис реестра ключей предназначен для управления данными о RFID-ключах на платформе "Ключ". Сервис позволяет:
- добавлять и/или изменять записи об изготовленных RFID-ключах;
- получать данные о RFID-ключах из реестра ключей.
Каждая запись в реестре ключей хранит данные о конкретном физическом RFID-ключе (болванке). Производители таких ключей могут подгружать на сервер данные о новых партиях изготовленных RFID-ключей или изменять данные о своих ключах, которые они ранее заносили в реестр ключей.
В API сервиса реестра ключей используется технология gRPC. Для сериализации структурированных данных применяется язык описания Protocol Buffers версии proto3.
Авторизация¶
Для доступа к сервисам Key API необходимо использовать токен авторизации. Токен выдаётся по заявке в службу технической поддержки Ростелеком (также вы можете обратиться к сотрудникам платформы "Ключ", с которыми вы контактируете напрямую). У вас должна быть зарегистрирована учётная запись на сайте key.rt.ru.
Способ авторизации:
В заголовке каждого запроса к серверу необходимо указывать токен доступа.
- Формат заголовка: Authorization: Bearer [токен]
Срок действия токена от 1 месяца до года. В случае, если в ответе вам приходит ошибка 401 --- ошибка аутентификации, это означает, что ваш токен доступа уже недействителен, и вам нужно сгенерировать новый токен. Для получения нового токена обратитесь в службу технической поддержки.
Если для метода с авторизацией отправить запрос без токена доступа или с некорректным токеном, в ответе вернётся код статуса ошибки "16 UNAUTHENTICATED". Это означает, что вам следует использовать корректный токен при формировании запроса на сервер.
Методы сервиса реестра ключей¶
| Метод | Описание |
|---|---|
| PostRecord | Добавление или обновление ключа |
| GetRecord | Получение данных о ключе |
| GetRecordList | Получение списка ключей |
| GetRecordCount | Получение количества ключей |
| DeleteRecord | Удаление ключа |
| GetSystemStatus | Проверка состояния сервиса |
Пример клиентского приложения¶
Пример клиентского приложения на C#. В примере показан порядок конфигурирования и использования клиентского SDK Keyapis сервиса Реестр ключей.
rpc PostRecord - Добавление или обновление RFID-ключа в реестре ¶
Требуется авторизация.
Используйте метод PostRecord для добавления или изменения записи о RFID-ключе в реестре ключей:
- Добавление нового RFID-ключа --- запрос отправляется с уникальным 14-битовым номером ключа
uid, но безid-идентификатора ключа. В этом случае сервер создаст уникальныйidи добавит новую запись в реестр. - Обновление RFID-ключа --- в запросе и в реестре ключей присутствует
idключа. В этом случае обновляются только изменённые атрибуты RFID-ключа в реестре.
uid --- это уникальный номер ключа, который вендор присваивает RFID-ключу у себя на производстве. Формат: 14 бит. Указывается при создании нового RFID-ключа в реестре.
id --- это номер RFID-ключа в реестре на сервере. Тип строка 7 байт в формате GUID. Генерируется сервером при добавлении нового RFID-ключа в реестр, а в дальнейшем используется для обращения к ключу в запросах методов реестра.
После авторизации вы (как производитель) можете изменять только свои ключи, которые вы уже добавляли в реестр с этой же учётной записью.
-
Запрос --- PostRecordRequest
-
Ответ --- PostRecordResponse
В качестве тела запроса передаётся JSON-объект с атрибутами нового/обновляемого RFID-ключа, которые помещаются в соответствующую запись в реестре ключей.
Параметры запроса:
| Поле | Тип | Описание |
|---|---|---|
| Record | объект | Обязательный. Запись в реестре ключей. Передаваемый на сервер JSON-объект с параметрами нового или обновляемого ключа. |
Примеры запроса
Примеры запроса для разных языков
Пример создания ключа в статусе SHIPPED (Отгружен). В данном случае для примера мы генерируем произвольный uid. Вы же будете использовать свой номер ключа uid.
В ответе возвращается JSON-объект с данными добавленного/обновлённого RFID-ключа или код ошибки в случае некорректного запроса.
Среди атрибутов созданного ключа теперь присутствует идентификатор id (тип GUID), сгенерированный сервером. Используйте его в дальнейшем для обращения к данному RFID-ключу при запросах в реестр ключей.
| Поле | Описание | Тип |
|---|---|---|
| Record | Запись в реестре, если результат ОК | keyapis.rfidregistry.v1.Record |
| error | Ошибка | keyapis.rfidregistry.v1.PostRecordResponse.Error |
Ошибка запроса сохранения записи с данными RFID-ключа
| Поле | Описание | Тип | Признак |
|---|---|---|---|
| validation | Ошибка валидации записи | keyapis.rfidregistry.v1.Record.ValidationError | optional |
| saving | Ошибка фильтрации | keyapis.rfidregistry.v1.Record.SavingError | optional |
| aes_key_configuration_item | Ошибка в элементе массива конфигурации шифрования ключа | keyapis.rfidregistry.v1.Record.AesKeyConfiguration.ItemError | optional |
| data_cell_item | Ошибка в элементе cодержимого ячейки ключа записи | keyapis.rfidregistry.v1.Record.DataCell.ItemError | optional |
| trailer_item | Ошибка в элементе валидации контрольной суммой записи | keyapis.rfidregistry.v1.Record.Trailer.ItemError | optional |
Дополнительная информация
Добавление нового RFID-ключа в реестр¶
При добавлении в реестр нового RFID-ключа передавайте в запросе номер ключа uid --- это строка длиной 7 байт (14 шестнадцатеричных символов).
После этого для каждого нового RFID-ключа сервер сгенерирует новый уникальный индентификатор id в виде строки 128 бит в формате GUID. В дальнейшем к RFID-ключу в реестре следует обращаться по id.
Метод PostRecord может понадобиться в момент окончания производства RFID-ключей, но до момента отправки их заказчику. В таком случае сохраняйте RFID-ключ в статусе "NEW" (новый) или "SHIPPED" (отгружен) со всеми требуемыми атрибутами.
Сценарий является публичным и требует авторизации.
sequenceDiagram
autonumber
participant c as Клиент
participant rr as Реестр ключей
c ->> rr: Запрос PostRecordRequest на добавление RFID-ключа
rr ->> rr: Проверка атрибутов
alt Атрибуты OK
%%rect rgb(191, 255, 223)
rr ->> c: Ответ PostRecordResponse
%%end
else Ошибка в атрибутах
%%rect rgb(255, 223, 223)
rr ->> c: Ответ gRPC "Error" в случае ошибки
%%end
end
Обновление RFID-ключа в реестре ¶
Метод обновления существующего RFID-ключа в реестре ключей.
Если RFID-ключ c ID уже существует в реестре, то по нему обновляются только новые данные (атрибуты), переданные в запросе.
Сценарий описывает взаимодействие с сервисом реестра ключей при изменении статуса RFID-ключа в реестре. При вызове метода PostRecord атрибуты должны соответствовать требованиям, поскольку осуществляется проверка передаваемых атрибутов и статуса.
Изменение статуса RFID-ключа может выполняться при отправке партии заказчику или при переводе RFID-ключа в статус дефективного. Также статус изменяется при удалении ключа.
Сценарий является публичным.
sequenceDiagram
autonumber
participant c as Клиент
participant rr as Реестр ключей
c ->> rr: Запрос PostRecordRequest на обновление RFID-ключа
rr ->> rr: Проверка атрибутов
alt Аттрибуты OK
rr ->> rr: Изменение атрибутов RFID-ключа
%%rect rgb(191, 255, 223)
rr ->> c: Ответ GRPC PostRecordResponse
%%end
else
%%rect rgb(255, 223, 223)
rr ->> c: Ответ GRPC PostRecordResponse в случае ошибки
%%end
end rpc GetRecord - Получение RFID-ключа из реестра ¶
Требуется авторизация.
Метод GetRecord позволяет получать информацию о RFID-ключе из реестра ключей. В ответе содержится объект в формате JSON с полями данных и атрибутами записи в реестре.
Вы можете получать данные только для своих ключей, которые вы ранее уже добавили в реестр ключей под своей учётной записью с токеном доступа.
-
Запрос --- GetRecordRequest
-
Ответ --- GetRecordResponse
Параметры запроса:
| Поле | Тип | Описание |
|---|---|---|
| id | string | Обязательный. Идентификатор RFID-ключа в реестре ключей. Тип: Guid. |
В качестве параметра запроса передаётся id-индентификатор ключа в формате строки 7 байт, тип Guid.
Примеры запроса
Примеры запроса для разных языков
Запрос метода GetRecord --- получить данные о RFID-ключе с заданным id. Это несуществующий id для примера. Вы же используйте id только тех ключей, которые вы сами добавили в реестр.
В этом примере сгенерируем произвольный id для запроса. Вы же используйте id только тех ключей, которые вы сами добавили в реестр.
| Поле | Описание | Тип |
|---|---|---|
| Record | Запись с данными RFID-ключа в реестре, если результат ОК | keyapis.rfidregistry.v1.Record |
| error | Ошибка | keyapis.rfidregistry.v1.GetRecordResponse.Error |
Ошибка запроса RFID-ключа из реестра
| Поле | Описание | Тип | Признак |
|---|---|---|---|
| validation | Ошибка валидации записи | keyapis.rfidregistry.v1.Record.ValidationError | optional |
rpc GetRecordList - Получение списка RFID-ключей из реестра ключей ¶
Требуется авторизация.
Метод GetRecordList позволяет получить заданный список RFID-ключей. Вы можете использовать полученные данные для постраничного вывода на экран, в файл или иное средство вывода.
В запросе необходимо указать параметры фильтра и постраничного вывода (пагинации). Ответ возвращается в формате потокового (стримингового) сообщения и содержит перечень RFID-ключей для постраничного вывода. Записи извлекаются из реестра, начиная с текущей позиции курсора.
В ответе возвращаются только те записи RFID-ключей, которые вы ранее сохранили в реестр ключей под своей учётной записью с токеном доступа.
-
Запрос --- GetRecordListRequest
-
Ответ --- GetRecordListResponse
Параметры запроса:
| Поле | Тип | Описание | Значение |
|---|---|---|---|
| filter | объект | Необязательный. Перечень отфильтрованных записей в реестре ключей. | 1 |
| pagination | oneof | Необязательный. Вариант разбиения на страницы. |
В случае запроса без параметров сервис вернёт ответ со списком RFID-ключей, отобранных с настройкой фильтрации и сортировки по умолчанию --- самые новые 20 записей по дате добавления в реестр.
Примеры запроса
Примеры запроса для разных языков
Пример запроса GetRecordList для отображения списка ключей.
В качестве параметра передаётся объект фильтра для отбора только нужных RFID-ключей. В данном примере отфильтруем только по номеру ключа uid. Это несуществующий uid для примера фильтрации выборки. Вы же используйте uid ключей, которые сами ранее добавляли в реестр.
В ответе на запрос списка RFID-ключей сервер возвращает перечень отфильтрованных записей в реестре ключей или код ошибки в случае некорректного запроса.
| Поле | Описание | Тип | Признак |
|---|---|---|---|
| data | Запись с данными RFID-ключа в реестре | keyapis.rfidregistry.v1.Record | optional |
| error | Ошибка | keyapis.rfidregistry.v1.GetRecordListResponse.Error | optional |
GetRecordListResponse.Error
Ошибки запроса получения списка RFID-ключей.
| Поле | Описание | Тип | Признак |
|---|---|---|---|
| record_filter_validation | Ошибка фильтрации записей | keyapis.rfidregistry.v1.RecordFilter.ValidationError | optional |
| record_paging_validation | Ошибка пагинации по страницам записей | keyapis.rfidregistry.v1.RecordPaging.ValidationError | optional |
rpc GetRecordCount - Получение количества RFID-ключей ¶
Требуется авторизация.
Используйте метод GetRecordCount, чтобы узнать общее количество доступных вам RFID-ключей в реестре с учётом заданного фильтра. Суммарное значение будет соответствовать только тем RFID-ключам, которые вы ранее сохраняли в реестр ключей под своей учётной записью с токеном доступа.
В запросе отправляется объект с параметрами фильтрации, по которым будут отобраны записи с данными RFID-ключей, соответствующие критериям. Далее на сервере подсчитывается количество таких записей и передаётся обратно в качестве ответа. В случае ошибок при проверке параметров фильтра в ответе будет выслан код ошибки.
-
Запрос --- GetRecordCountRequest
-
Ответ --- GetRecordCountResponse
Параметры запроса:
| Поле | Тип | Описание | Значение |
|---|---|---|---|
| filter | объект | Обязательный. Перечень отфильтрованных RFID-ключей в реестре ключей. | 1 |
Примеры запроса
Примеры запроса для разных языков
В данном примере запрос содержит несуществующий uid для фильтрации выборки. Вы же используйте uid ключей, которые сами ранее добавляли в реестр.
Пример ответа:
В этом примере показан запрос количества всех ключей, доступных для пользователя с конкретным токеном доступа.
А ниже пример запроса с фильтром по типу CARD (карта). В ответе возращается количество ключей, отфильтрованных и доступных для пользователя с данной учётной записью и токеном. Экранирование символов кавычек " требуется в консоли PowerShell.
Пример ответа:
В ответе на запрос количества RFID-ключей сервер возвращает количество доступных ключей с учётом параметров фильтрации или код ошибки в случае некорректного запроса.
Пример ответа:
| Поле | Описание | Тип | Признак |
|---|---|---|---|
| data | Объект с количеством RFID-ключей | keyapis.rfidregistry.v1.Record | optional |
| error | Ошибка | keyapis.rfidregistry.v1.GetRecordCountResponse.Error | optional |
GetRecordCountResponse.Error Ошибка запроса количества RFID-ключей.
| Поле | Описание | Тип | Признак |
|---|---|---|---|
| record_filter_validation | Ошибка фильтрации записей | keyapis.rfidregistry.v1.RecordFilter.ValidationError | optional |
rpc DeleteRecord - Удаление RFID-ключа ¶
Требуется авторизация.
Метод DeleteRecord позволяет удалять доступные вам RFID-ключи из реестра.
Вы можете удалять только свои RFID-ключи, которые ранее сохранили в реестре ключей под своей учётной записью с токеном доступа. При этом из реестра можно удалить только те записи RFID-ключей, которые ещё не привязаны к активированным ключам, используемым их владельцами.
Обратите внимание, что после удаления RFID-ключа сама запись в реестре остаётся со статусом "Удалён" (Deleted). И теперь добавить RFID-ключ можно только с новым id-идентификатором.
-
Запрос --- DeleteRecordRequest
-
Ответ --- DeleteRecordResponse
Параметры запроса:
| Поле | Тип | Описание | Значение |
|---|---|---|---|
| id | string | Обязательный. Идентификатор RFID-ключа, удаляемого из реестра ключей. | 1 |
Примеры запроса
Примеры запроса
Запрос метода DeleteRecord --- удалить данные о RFID-ключе с заданным id. Это несуществующий id для примера. Вы же используйте id только тех ключей, которые вы сами добавили в реестр.
Здесь показан пример запроса с абстрактным id. Вы же используйте id только тех ключей, которые вы сами добавили в реестр.
В ответе сервера на запрос удаления RFID-ключа из реестра ключей возвращается пустая строка. Это означает успешное удаление ключа, при котором соответствующей записи в реестре присваивается статус "Deleted". В случае ошибки ответ возвращается с кодом этой ошибки.
rpc GetSystemStatus - Проверка состояния сервиса ¶
Метод без авторизации
Метод GetSystemStatus позволяет получить сведения о работоспособности сервиса реестра ключей.
-
Запрос --- GetSystemStatusRequest
-
Ответ --- GetSystemStatusResponse
В запросе в качестве параметра отправляется пустой объект {} или пустая строка. В случае доступности сервиса возвращается ответ с пустым объектом {} или с кодом ошибки.
Примеры запроса
Примеры запроса
В ответе сервера на запрос о доступности реестра ключей возвращается пустой объект {}. Это значит, что сервис доступен и функционирует. В случае ошибки ответ возвращается с кодом этой ошибки.
Record¶
Запись в реестре ключей с информацией об отдельном RFID-ключе. При взаимодействии клиент-сервер данные о ключе упаковываются в JSON-объект, который передаётся в качестве тела запроса или ответа сервиса реестра ключей.
Параметры:
| Поле | Тип | Признак | Описание |
|---|---|---|---|
| id | string | Уникальный идентификатор ключа. Если не передан, создаётся сервером. Тип: Guid | |
| rfid_type | keyapis.rfidregistry.v1.Record.RfidType | Тип ключа | |
| encryption_type | keyapis.rfidregistry.v1.Record.EncryptionType | Тип шифрования ключа. Максимально поддерживаемый ключом тип шифрования SL3 | |
| uid | string | Номер ключа. Указывается при создании | |
| status_type | keyapis.rfidregistry.v1.Record.StatusType | Тип статуса ключа | |
| new_at | google.protobuf.Timestamp | Дата перевода в статус "Новый" | |
| shipped_at | google.protobuf.Timestamp | Дата перевода в статус "Отгружен" | |
| defect_at | google.protobuf.Timestamp | Дата перевода в статус "Брак" | |
| in_use_at | google.protobuf.Timestamp | Дата перевода в статус "Использован" | |
| in_use_rfid_id | google.protobuf.StringValue | Идентификатор привязанного ключа. Заполняется при переводе в статус "Использован" | |
| data_cells | keyapis.rfidregistry.v1.Record.DataCell | repeated | Содержимое ячеек ключа |
| resource_owner_id | string | Идентификатор владельца. Заполняется сервером | |
| package_info_box | google.protobuf.Int32Value | Номер коробки | |
| package_info_place | google.protobuf.Int32Value | Номер места в коробке | |
| changed_at | google.protobuf.Timestamp | Дата последнего изменения. Заполняется и обновляется сервером. Заполняется при создании и изменении. Является версией объекта | |
| aes_key_configurations | keyapis.rfidregistry.v1.Record.AesKeyConfiguration | repeated | Конфигурации шифрования ключа |
| trailers | keyapis.rfidregistry.v1.Record.Trailer | repeated | Контрольные суммы. Нужны для ключей SL1 и SL3 |
| order_number | string | Номер заказа | |
| order_at | google.protobuf.Timestamp | Дата заказа | |
| in_use_resource_owner_id | google.protobuf.StringValue | Владелец привязанного ключа. Заполняется сервером, значение берётся из токена при использовании ключа |
Пример JSON-объекта Record
{
"item": {
"id": "12345678-9ABC-DEF0-0000-000000000000",
"rfidType": "FOB",
"encryptionType": "SL0",
"uid": "1234567ABCDEF0",
"statusType": "NEW",
"inUseRfidId": "string",
"dataCells": [
{
"section": 0,
"block": 0,
"data": "string"
}
],
"packageInfoBox": 0,
"packageInfoPlace": 0,
"aesKeyConfigurations": [
{
"address": "string",
"data": "string"
}
],
"trailers": [
{
"sector": 0,
"keyA": "string",
"keyB": "string",
"accessMask": "string"
}
],
"orderNumber": "string",
"orderAt": "2023-04-02T23:52:15.736Z"
},
"isLite": true
}
RecordFilter¶
Фильтр записей из реестра ключей. Используется в качестве объекта с параметрами запроса для получения отфильтрованного списка RFID-ключей из реестра ключей.
| Поле | Фильтрация | Тип | Признак |
|---|---|---|---|
| ids | По идентификаторам. Тип: Guid | string | repeated |
| rfid_types | По типам ключей | keyapis.rfidregistry.v1.Record.RfidType | repeated |
| encryption_types | По типам шифрования | keyapis.rfidregistry.v1.Record.EncryptionType | repeated |
| uids | По номерам ключей | string | repeated |
| status_types | По типам статуса | keyapis.rfidregistry.v1.Record.StatusType | repeated |
| in_use_rfid_ids | По номерам привязанных ключей | string | repeated |
| resource_owner_ids | По владельцам | string | repeated |
| order_numbers | По номерам заказа | string | repeated |
| in_use_resource_owner_ids | По владельцам привязанных ключей | string | repeated |
Тип ключа¶
Обозначает форм-фактор или физическую сущность ключа.
Поле rfid_type --- обязательное в момент добавления нового ключа.
Справочник типов ключей.
| Тип ключа | Описание |
|---|---|
| RFID_TYPE_UNKNOWN | Значение не указано |
| FOB | Брелок |
| CARD | Карта |
| BAND | Браслет |
| STICKER | Стикер |
| ACTIVE_TAG | Активная метка |
Значение по умолчанию --- CARD (карта).
Тип статуса ключа¶
Справочник возможных типов статусов ключа.
Поле status_type --- обязательное в любых запросах.
| Статус | Описание |
|---|---|
| STATUS_TYPE_UNKNOWN | Значение не указано |
| NEW | Новый |
| SHIPPED | Отгружен |
| DEFECT | Брак |
| IN_USE | Использован |
Тип шифрования ключа¶
Справочник типов шифрования ключа.
Поле encryption_type --- обязательное в момент добавления нового ключа.
| Тип шифрования ключа | Описание |
|---|---|
| ENCRYPTION_TYPE_UNKNOWN | Значение не указано |
| SL0 | Без шифрования |
| SL1 | С шифрованием, копируемый |
| SL3 | С шифрованием, не копируемый |
Максимально поддерживаемый ключом тип шифрования SL3.
Таблица обязательности передачи полей в Request¶
Ниже представлена схема обязательности передачи полей и модель изменения статусов ключей.
| Атрибуты | Описание | o -> new | o -> shipped | new -> defect | new -> shipped |
|---|---|---|---|---|---|
| id | Идентификатор записи | O | O | M | M |
| uid | Номер ключа | M | M | - | - |
| status_type | Статус ключа | M | M | M | M |
| data_cells | Содержимое ячеек | O | O | - | O |
| package_info | Информация о партии | O | O | - | O |
| order_number | Номер заказа | M | M | - | - |
| order_at | Дата заказа | M | M | - | - |
| rfid_type | Тип RFID-ключа | M | M | - | - |
| encryption_type | Тип шифрования | M | M | - | - |
| trailers | Контрольные суммы записи ячеек ключа с типом шифрования SL1 и SL3 | O | O | - | O |
| aes_key_configurations | Конфигурация шифрования ключа | O | O | - | O |
| resource_owner_id | Идентификатор владельца или создателя | O | O | - | - |
id--- если идентификаторidне передан, сервер создаёт новый ключ с новымid.resource_owner_id--- заполняется из токена.
Обозначения M --- Обязательный атрибут (Mandatory)
O --- Необязательный атрибут (Optional)
- --- Передаётся текущее состояние, сервис не обновляет значение поля в базе.
Скалярные типы данных Protobuf¶
Скалярные типы данных, используемые в gRPC-методах сервиса, и их соответствие типам в различных языковых средах представлены в документации Google Protocol Buffers.
Proto файл¶
Proto-файл представляет собой контракт структурированных данных и методов для клиента и сервера. В рамках технологии gRPC поддерживается до 12 языков программирования.
Используйте proto-файл сервиса для компилирования клиента, который будет работать с выбранным языком программирования. Процедура компилирования proto-файла доступна на сайте https://grpc.io/.
Скачать proto-файл: keyapis_rfidregistry_record_v1.proto
Глоссарий¶
| Термин | Определение |
|---|---|
| Ключ | Активированный ключ в пользовании у владельца (жильца или сотрудника управляющей компании). |
| RFID-ключ | Ключ-болванка до момента попадания в руки владельца и активации его на платформе "Ключ". |
| УК | Управляющая компания |