Claves API
`keys.list`, `list_all`, `iterate`, `get`, `create`, `update`, `delete`, `rotate` y `revoke`, y los lectores del registro de solicitudes y de la actividad.
Todos los métodos
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 y rotate son las únicas llamadas que devuelven un secreto, en token, una vez. Cada lectura devuelve maskedKey en su lugar. update desactiva y activa una clave con enabled, la alternativa reversible a revoke, y delete solo quita una clave que ya se revocó: cualquier otra clave da un 409 not_revoked. Leer necesita keys:read y cada cambio keys:manage.
La gema nunca reintenta create ni rotate. Un reintento tras una respuesta perdida crearía una segunda clave, o invalidaría el secreto que devolvió el primer intento. update y revoke se reintentan tras un fallo de red, porque repetirlos deja la misma clave, y delete no.
Nunca más amplia que quien llama
Una clave nunca crea ni alcanza una clave más amplia que ella misma. Ámbitos, rol, caducidad, modo y ámbito de envío tienen que quedar dentro de la clave que llama, o la llamada lanza OpenEmail::PermissionError con el código beyond_caller_authority, y param nombra el eje. Una clave acotada a algunos dominios o direcciones solo ve las claves dentro de su propio ámbito de envío. rotate sobre la clave que llama también funciona con keys:write, como client.me.rotate.
La verificación adicional no puede aplicarse a una llamada hecha con una clave, así que keys:manage es una credencial que crea credenciales. Dala solo a una automatización que emite claves, dale a esa clave un rol, un ámbito de envío y una caducidad, y vigila list_workspace_activity, donde todo lo que hace queda registrado a su nombre.
Registro de solicitudes y actividad
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 y list_activity leen una clave, y list_workspace_requests y list_workspace_activity leen todas las claves o las que nombra key_ids:. Cada una tiene al lado un gemelo list_all_ y otro iterate_, como list_all_requests e iterate_requests. Aceptan since: y until: como Time, DateTime o cadena ISO 8601, y los lectores de solicitudes aceptan además failed_only:.
until es una palabra reservada en Ruby, pero until: funciona tal cual como argumento nombrado. Tiene que ser posterior a since:, o la llamada lanza OpenEmail::InvalidRequestError con el código invalid_parameter.