API anahtarları
`keys.list`, `list_all`, `iterate`, `get`, `create`, `update`, `delete`, `rotate` ve `revoke`, ayrıca istek günlüğü ve etkinlik okuyucuları.
Her yöntem
from pathlib import Path from openemail import openemail key = openemail.keys.create({ 'name': 'Billing sender', 'scopes': ['emails:send'], 'domainAllowlist': ['billing.acme.com'], 'expiresInMinutes': 60 * 24 * 90,}) secret = Path('.openemail-billing-key')secret.touch(mode=0o600)secret.write_text(key['token']) openemail.keys.update(key['id'], {'enabled': False}) rotated = openemail.keys.rotate(key['id'])secret.write_text(rotated['token']) openemail.keys.revoke(key['id'], {'reason': 'Replaced'})openemail.keys.delete(key['id'])create ve rotate, token içinde bir kez gizli değer döndüren tek çağrılardır. Her okuma bunun yerine maskedKey döndürür. update bir anahtarı enabled ile kapatıp açar, bu revoke işleminin geri alınabilir alternatifidir; delete ise yalnızca iptal edilmiş bir anahtarı kaldırır. Okumak keys:read, her değişiklik keys:manage ister.
İstemci create ya da rotate çağrılarını asla yeniden denemez. Kaybolan bir yanıtın ardından yapılan yeniden deneme ikinci bir anahtar üretir ya da ilk denemenin döndürdüğü gizli anahtarı geçersiz kılardı. update ve revoke okumalar gibi yeniden denenir, çünkü onları tekrarlamak anahtarı aynı bırakır; delete ise yeniden denenmez.
Asla çağırandan geniş değil
Bir anahtar kendisinden geniş bir anahtar asla oluşturmaz ve ona asla ulaşmaz: kapsamlar, rol, süre, mod ve gönderim kapsamı çağıran anahtarın içinde kalmalıdır, yoksa çağrı 403 beyond_caller_authority ile reddedilir. Bazı alan adlarına veya adreslere daraltılmış bir anahtar yalnızca kendi gönderim kapsamının içindeki anahtarları görür. Çağıran anahtar üzerindeki rotate, me.rotate() gibi keys:write ile de çalışır.
Ek doğrulama bir anahtarla yapılan çağrıya uygulanamaz, bu yüzden keys:manage kimlik bilgisi üreten bir kimlik bilgisidir. Onu yalnızca anahtar üreten bir otomasyona verin, o anahtara bir rol, bir gönderim kapsamı ve bir süre verin ve yaptığı her şeyin ona kaydedildiği list_workspace_activity çıktısını izleyin.
İstek günlüğü ve etkinlik
from datetime import datetime, timedelta, timezone from openemail import openemail failures = openemail.keys.list_requests( '4c1b257a66287fd113bd89d0', failed_only=True, since=datetime.now(timezone.utc) - timedelta(days=1),)for request in failures['items']: print(request['status'], request['method'], request['path']) for change in openemail.keys.iterate_workspace_activity(): actor = change['actor'] print(change['keyName'], change['type'], actor['label'] if actor else None)list_requests ve list_activity tek bir anahtarı, list_workspace_requests ve list_workspace_activity ise her anahtarı ya da key_ids içinde adı geçenleri okur ve her birinin yanında bir list_all_… ve bir iterate_… vardır. since ve until alırlar, istek okuyucuları ayrıca failed_only alır.
since ve until bir datetime ya da ISO 8601 dizesi alır. Bir datetime UTC olarak gönderilir; saat dilimi bilgisi olmayan (naive) bir değer ise önce yerel saat olarak okunur.
Referans
keys.list()Tam başvurukeys.list_all()Tam başvurukeys.iterate()Tam başvurukeys.get()Tam başvurukeys.create()Tam başvurukeys.update()Tam başvurukeys.delete()Tam başvurukeys.rotate()Tam başvurukeys.revoke()Tam başvurukeys.list_requests()Tam başvurukeys.list_all_requests()Tam başvurukeys.iterate_requests()Tam başvurukeys.list_activity()Tam başvurukeys.list_all_activity()Tam başvurukeys.iterate_activity()Tam başvurukeys.list_workspace_requests()Tam başvurukeys.list_all_workspace_requests()Tam başvurukeys.iterate_workspace_requests()Tam başvurukeys.list_workspace_activity()Tam başvurukeys.list_all_workspace_activity()Tam başvurukeys.iterate_workspace_activity()Tam başvuru