API-Schlüssel
`keys.list`, `list_all`, `iterate`, `get`, `create`, `update`, `delete`, `rotate` und `revoke` sowie die Leser für Anfrageprotokoll und Aktivität.
Jede Methode
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 und rotate sind die einzigen Aufrufe, die ein Secret zurückgeben, in token, einmal. Jeder Lesezugriff liefert stattdessen maskedKey. update schaltet einen Schlüssel mit enabled aus und ein, die umkehrbare Alternative zu revoke, und delete entfernt nur einen widerrufenen Schlüssel. Lesen braucht keys:read und jede Änderung keys:manage.
Der Client wiederholt create oder rotate nie. Ein erneuter Versuch nach einer verlorenen Antwort würde einen zweiten Schlüssel ausstellen oder das Secret ungültig machen, das der erste Versuch zurückgegeben hat. update und revoke werden wie Lesevorgänge wiederholt, weil ihre Wiederholung denselben Schlüssel hinterlässt, delete dagegen nicht.
Nie weiter als der Aufrufer
Ein Schlüssel erzeugt oder erreicht nie einen Schlüssel, der weiter reicht als er selbst: Scopes, Rolle, Ablauf, Modus und Sendebereich müssen alle innerhalb des aufrufenden Schlüssels liegen, sonst wird der Aufruf mit 403 beyond_caller_authority abgewiesen. Ein auf bestimmte Domains oder Adressen eingegrenzter Schlüssel sieht nur die Schlüssel innerhalb seines eigenen Sendebereichs. rotate auf dem aufrufenden Schlüssel geht auch mit keys:write, wie me.rotate().
Die erneute Bestätigung kann bei einem Aufruf mit einem Schlüssel nicht greifen, also ist keys:manage ein Zugang, der Zugänge erzeugt. Geben Sie ihn nur einer Automatisierung, die Schlüssel ausstellt, geben Sie diesem Schlüssel eine Rolle, einen Sendebereich und einen Ablauf, und beobachten Sie list_workspace_activity, wo alles, was er tut, auf ihn verbucht wird.
Anfrageprotokoll und Aktivität
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 und list_activity lesen einen Schlüssel, list_workspace_requests und list_workspace_activity jeden Schlüssel oder die, die key_ids nennt, und jede hat ein list_all_… und ein iterate_… daneben. Sie nehmen since und until, und die Anfrage-Leser nehmen zusätzlich failed_only.
since und until nehmen ein datetime oder einen ISO-8601-String. Ein datetime wird in UTC gesendet, und ein naives wird zuvor als Ortszeit gelesen.
Referenz
keys.list()Vollständige Referenzkeys.list_all()Vollständige Referenzkeys.iterate()Vollständige Referenzkeys.get()Vollständige Referenzkeys.create()Vollständige Referenzkeys.update()Vollständige Referenzkeys.delete()Vollständige Referenzkeys.rotate()Vollständige Referenzkeys.revoke()Vollständige Referenzkeys.list_requests()Vollständige Referenzkeys.list_all_requests()Vollständige Referenzkeys.iterate_requests()Vollständige Referenzkeys.list_activity()Vollständige Referenzkeys.list_all_activity()Vollständige Referenzkeys.iterate_activity()Vollständige Referenzkeys.list_workspace_requests()Vollständige Referenzkeys.list_all_workspace_requests()Vollständige Referenzkeys.iterate_workspace_requests()Vollständige Referenzkeys.list_workspace_activity()Vollständige Referenzkeys.list_all_workspace_activity()Vollständige Referenzkeys.iterate_workspace_activity()Vollständige Referenz