تخطَّ إلى المستندات
Python

مفاتيح API

`keys.list` و`list_all` و`iterate` و`get` و`create` و`update` و`delete` و`rotate` و`revoke`، وقارئات سجل الطلبات والنشاط.

كل الدوالّ

keys.py
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. فإعادة المحاولة بعد استجابة ضائعة ستصدر مفتاحًا ثانيًا، أو تُبطل السر الذي أعادته المحاولة الأولى. أما update وrevoke فيُعادان كالقراءات، لأن تكرارهما يترك المفتاح نفسه، وdelete لا يُعاد.

لا يتجاوز المستدعي أبدًا

لا ينشئ المفتاح أبدًا مفتاحًا أوسع منه ولا يصل إليه: يجب أن تبقى النطاقات والدور وانتهاء الصلاحية والوضع ونطاق الإرسال كلها داخل المفتاح المستدعي، وإلا رُفض الاستدعاء بـ403 beyond_caller_authority. المفتاح المقيّد ببعض النطاقات أو العناوين لا يرى إلا المفاتيح الواقعة داخل نطاق إرساله. ويعمل rotate على المفتاح المستدعي نفسه أيضًا بـkeys:write، مثل me.rotate().

لا يمكن تطبيق التحقق الإضافي على استدعاء يجري بمفتاح، لذا فإن keys:manage اعتماد يصنع اعتمادات. امنحه فقط لأتمتة تصدر المفاتيح، وامنح ذلك المفتاح دورًا ونطاق إرسال وانتهاء صلاحية، وراقب list_workspace_activity حيث يُسجَّل كل ما يفعله باسمه.

سجل الطلبات والنشاط

key_logs.py
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. ويُرسَل datetime بتوقيت UTC، أما الساذج (naive) منه فيُقرأ أولًا بالتوقيت المحلي.

المرجع