API कुंजियाँ
`keys.list`, `list_all`, `iterate`, `get`, `create`, `update`, `delete`, `rotate` और `revoke`, और अनुरोध लॉग व गतिविधि के रीडर।
हर मेथड
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 और rotate ही ऐसी कॉल हैं जो सीक्रेट लौटाती हैं, token में, एक बार। हर रीड इसकी जगह maskedKey लौटाता है। update किसी कुंजी को enabled से बंद और चालू करता है, जो revoke का उलटा जा सकने वाला विकल्प है, और delete सिर्फ़ रद्द की गई कुंजी को हटाता है। पढ़ने के लिए keys:read और हर बदलाव के लिए keys:manage चाहिए।
क्लाइंट create या rotate को कभी retry नहीं करता। खोए रिस्पॉन्स के बाद retry एक दूसरी कुंजी बना देता, या पहली कोशिश ने जो secret लौटाया था उसे अमान्य कर देता। update और revoke reads की तरह retry होते हैं, क्योंकि उन्हें दोहराने से कुंजी वैसी ही रहती है, और delete retry नहीं होता।
कभी कॉल करने वाले से ज़्यादा व्यापक नहीं
कोई कुंजी कभी खुद से ज़्यादा व्यापक कुंजी नहीं बनाती और न उस तक पहुँचती है: स्कोप, भूमिका, समाप्ति, मोड और भेजने का दायरा, सब कॉल करने वाली कुंजी के भीतर रहने चाहिए, वरना कॉल 403 beyond_caller_authority के साथ ठुकराई जाती है। कुछ डोमेन या पतों तक सीमित कुंजी सिर्फ़ अपने भेजने के दायरे के भीतर की कुंजियाँ देखती है। कॉल करने वाली कुंजी पर rotate भी keys:write से होता है, me.rotate() की तरह।
दोबारा सत्यापन किसी कुंजी से की गई कॉल पर लागू नहीं हो सकता, इसलिए keys:manage ऐसा क्रेडेंशियल है जो क्रेडेंशियल बनाता है। इसे सिर्फ़ उस ऑटोमेशन को दें जो कुंजियाँ जारी करता है, उस कुंजी को एक भूमिका, भेजने का दायरा और समाप्ति दें, और list_workspace_activity पर नज़र रखें, जहाँ वह जो कुछ करती है उसी के नाम दर्ज होता है।
अनुरोध लॉग और गतिविधि
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 और list_activity एक कुंजी पढ़ते हैं, list_workspace_requests और list_workspace_activity हर कुंजी या वे जो key_ids में हैं, और हर एक के साथ एक list_all_… और एक iterate_… है। वे since और until लेते हैं, और अनुरोध रीडर failed_only भी लेते हैं।
since और until एक datetime या ISO 8601 string लेते हैं। datetime UTC में भेजा जाता है, और naive वाले को पहले स्थानीय समय माना जाता है।
संदर्भ
keys.list()पूरा रेफ़रेंसkeys.list_all()पूरा रेफ़रेंसkeys.iterate()पूरा रेफ़रेंसkeys.get()पूरा रेफ़रेंसkeys.create()पूरा रेफ़रेंसkeys.update()पूरा रेफ़रेंसkeys.delete()पूरा रेफ़रेंसkeys.rotate()पूरा रेफ़रेंसkeys.revoke()पूरा रेफ़रेंसkeys.list_requests()पूरा रेफ़रेंसkeys.list_all_requests()पूरा रेफ़रेंसkeys.iterate_requests()पूरा रेफ़रेंसkeys.list_activity()पूरा रेफ़रेंसkeys.list_all_activity()पूरा रेफ़रेंसkeys.iterate_activity()पूरा रेफ़रेंसkeys.list_workspace_requests()पूरा रेफ़रेंसkeys.list_all_workspace_requests()पूरा रेफ़रेंसkeys.iterate_workspace_requests()पूरा रेफ़रेंसkeys.list_workspace_activity()पूरा रेफ़रेंसkeys.list_all_workspace_activity()पूरा रेफ़रेंसkeys.iterate_workspace_activity()पूरा रेफ़रेंस