API-ключи
`keys.list`, `list_all`, `iterate`, `get`, `create`, `update`, `delete`, `rotate` и `revoke`, а также методы чтения журнала запросов и активности.
Все методы
key = client.keys.create( name: "Billing sender", scopes: ["emails:send"], domainAllowlist: ["billing.acme.com"], expiresInMinutes: 60 * 24 * 90) File.write(".openemail-billing-key", key[:token]) client.keys.update(key[:id], enabled: false) rotated = client.keys.rotate(key[:id])File.write(".openemail-billing-key", rotated[:token]) client.keys.revoke(key[:id], reason: "Replaced")client.keys.delete(key[:id])create и rotate являются единственными вызовами, которые возвращают секрет, в token, один раз. Каждое чтение вместо этого возвращает maskedKey. update выключает и включает ключ через enabled, что является обратимой альтернативой revoke, а delete удаляет только отозванный ключ: любой другой даёт 409 not_revoked. Для чтения нужна keys:read, а для любого изменения keys:manage.
Гем никогда не повторяет create или rotate. Повтор после потерянного ответа выпустил бы второй ключ или сделал бы недействительным секрет, который вернула первая попытка. update и revoke повторяются после сетевого сбоя, потому что их повтор оставляет тот же ключ, а delete не повторяется.
Никогда не шире вызывающего
Ключ никогда не создаёт ключ шире себя и не получает к нему доступа. Области, роль, срок действия, режим и область отправки должны укладываться в рамки вызывающего ключа, иначе вызов выбрасывает OpenEmail::PermissionError с кодом beyond_caller_authority, а param называет ось. Ключ, суженный до некоторых доменов или адресов, видит только ключи в пределах собственной области отправки. rotate для вызывающего ключа работает и с keys:write, как client.me.rotate.
Повторное подтверждение нельзя применить к вызову, сделанному ключом, поэтому keys:manage является доступом, который создаёт доступы. Давайте его только автоматизации, выпускающей ключи, дайте этому ключу роль, область отправки и срок действия и следите за list_workspace_activity, где всё, что он делает, записывается на него.
Журнал запросов и активность
failures = client.keys.list_requests( "4c1b257a66287fd113bd89d0", failed_only: true, since: Time.now - (24 * 60 * 60))puts failures.items.size client.keys.iterate_workspace_activity do |change| puts [change[:keyName], change[:type], change.dig(:actor, :label)].join(" ")endlist_requests и list_activity читают один ключ, а list_workspace_requests и list_workspace_activity читают все ключи или те, что называет key_ids:. У каждого есть двойники list_all_ и iterate_, например list_all_requests и iterate_requests. Они принимают since: и until: как Time, DateTime или строку ISO 8601, а методы чтения запросов принимают также failed_only:.
until является зарезервированным словом в Ruby, но until: работает как именованный аргумент в таком виде. Он должен быть позже since:, иначе вызов выбрасывает OpenEmail::InvalidRequestError с кодом invalid_parameter.