API-ключи
`keys.list`, `listAll`, `iterate`, `get`, `create`, `update`, `delete`, `rotate` и `revoke`, а также чтение журнала запросов и активности.
Все методы
const key = await openemail.keys.create({ name: 'Billing sender', scopes: ['emails:send'], domainAllowlist: ['billing.acme.com'], expiresInMinutes: 60 * 24 * 90,}) await store(key.token) await openemail.keys.update(key.id, { enabled: false })const rotated = await openemail.keys.rotate(key.id)await openemail.keys.revoke(key.id, { reason: 'Replaced' })await openemail.keys.delete(key.id)create и rotate единственные вызовы, которые возвращают секрет, в token, один раз. Любое чтение вместо него возвращает maskedKey. update выключает и включает ключ через enabled, это обратимая альтернатива revoke, а delete убирает только уже отозванный ключ. Чтение требует keys:read, любое изменение keys:manage.
Никогда не шире вызывающего
Ключ никогда не создаёт и не достаёт ключ шире себя: скоупы, роль, срок действия, режим и область отправки должны лежать внутри вызывающего ключа, иначе вызов отклоняется с 403 beyond_caller_authority. Ключ, суженный до некоторых доменов или адресов, видит только ключи внутри своей области отправки. rotate для самого вызывающего ключа работает и с keys:write, как me.rotate().
Повторное подтверждение нельзя применить к вызову, сделанному ключом, поэтому keys:manage это доступ, который создаёт доступы. Давайте его только автоматизации, выпускающей ключи, дайте этому ключу роль, область отправки и срок действия и следите за listWorkspaceActivity, где всё, что он делает, записано на него.
Журнал запросов и активность
const failures = await openemail.keys.listRequests('4c1b257a66287fd113bd89d0', { failedOnly: true, since: new Date(Date.now() - 24 * 60 * 60 * 1000),}) for await (const change of openemail.keys.iterateWorkspaceActivity()) { console.log(change.keyName, change.type, change.actor?.label)}listRequests и listActivity читают один ключ, listWorkspaceRequests и listWorkspaceActivity читают все ключи или те, что названы в keyIds, и у каждого рядом есть listAll… и iterate…. Они принимают since и until, а методы журнала запросов ещё и failedOnly.