الوصول باستخدام PHP إلى Exchange / Office 365

تم الإعلان عنه منذ فترة طويلة - الواقع الآن : لقد أوقفت Microsoft المصادقة بكلمة مرور لبعض البروتوكولات في Exchange Online من سبتمبر 2022 لصالح oAuth2. توضح مشكلات GitHub في العديد من المكتبات ونصوص النسخ الاحتياطي أن التغيير قد فاجأ العديد من المسؤولين. نعرض أدناه طريقة يمكنك من خلالها الاستمرار في الوصول إلى محتويات صندوق بريد Exchange الخاص بك بمساعدة oAuth2 عبر PHP عبر IMAP.


من وجهة نظر أمنية ، يعد تحرك Microsoft صحيحًا للغاية ، لكن تعقيد الوصول البرمجي إلى رسائل البريد الإلكتروني الخاصة بها قد زاد قليلاً. على سبيل المثال ، إذا كنت تستخدم مكتبة barbushin / php-imap المستخدمة على نطاق واسع ، فسيكون الوصول كما يلي:

734a82898010e2fcb02c72c3cd9702c2

انها فقط لا تعمل بعد الآن. من أجل إنشاء اتصال عبر oAuth2 ، تتمثل الصعوبة الأولى في الحصول على رمز الوصول. ولهذا عليك أن تواجه عقبتين.

دليل Azure النشط

تسجل الخطوات التالية تطبيقًا جديدًا في Azure Active Directory:

تسجيل الدخول إلى https://portal.azure.com
افتح "Azure Active Directory"
حدد "تسجيلات التطبيق" و "تسجيل جديد".
انسخ "معرف التطبيق (العميل)" (= معرف العميل) & "معرف الدليل (المستأجر)" (= معرف المستأجر).
"أذونات واجهة برمجة التطبيقات" و "إضافة الإذن"
"واجهات برمجة التطبيقات التي تستخدمها مؤسستي" و "Office 365 Exchange Online"
"أذونات التطبيق" و "IMAP.AccessAsApp"
منح موافقة المسؤول
"الشهادات والأسرار" و "أسرار العميل" و "سر العميل الجديد"
اختر وصفًا وقم بتعيين الصلاحية
انسخ "المعرف السري" (سر العميل) إلى الحافظة
افتح تطبيقات المؤسسة
انسخ "معرف الكائن".

بوويرشيل

الآن ندير التطبيق في مايكروسوفت بوويرشيل (وضع المسؤول) وتعيين أذونات لصناديق البريد الفردية (<TENANTID>, <CLIENTID>, <OBJECTID>, <EMAIL> يجب استبداله في كل حالة):

Install-Module -Name ExchangeOnlineManagement
Import-Module ExchangeOnlineManagement
Connect-ExchangeOnline -Organization <TENANTID>

New-ServicePrincipal -AppId <CLIENTID> -ServiceId <OBJECTID>
Add-MailboxPermission -Identity "<EMAIL>" -User <OBJECTID> -AccessRights FullAccess
...

بمجرد القيام بذلك ، فإن الباقي ليس علم الصواريخ. نظرًا لأن barbushin / php-imap لا يدعمان oAuth2 ، يمكنك الاتصال بالمكتبة البديلة Webklex / php-imap (والتي تتمتع أيضًا بميزة عدم طلب وحدة PHP IMAP ).:

734a82898010e2fcb02c72c3cd9702c2

ومع ذلك ، يمكن أيضًا استخدام المكتبات التي لا تدعم oAuth2 رسميًا مع وكيل مثل simonrob / البريد الإلكتروني- oauth2- الوكيل اجعلها قابلة للتطبيق. بعد هذا تحميل والتثبيت عبر python -m pip install -r requirements-no-gui.txt (مطلوب Python ≥3.6) تقوم بتحرير الملف emailproxy.config على سبيل المثال على النحو التالي (استبدال هذه المرة <TENANTID>, <CLIENTID>, <CLIENTSECRET> و <EMAIL>):

[Server setup]

[IMAP-1993]
local_address = localhost
server_address = outlook.office365.com
server_port = 993

[Account setup]

[<EMAIL>]
token_url = https://login.microsoftonline.com/<TENANTID>/oauth2/v2.0/token
oauth2_scope = https://outlook.office365.com/.default
redirect_uri = http://localhost:8080
client_id = <CLIENTID>
client_secret = <CLIENTSECRET>

ثم تبدأ الوكيل بـ python emailproxy.py --no-gui ويمكن الآن الانتقال إلى IP غير المشفر localhost في الميناء 1993 الاتصال عبر المصادقة الأساسية العادية (وأي مجموعة كلمات مرور). إذا كنت ترغب في بدء تشغيل الوكيل كخدمة في الخلفية عند بدء تشغيل النظام ، فيمكنك استخدام ، على سبيل المثال systemd:

sudo systemctl edit --force --full emailproxy.service

[Unit]
Description=Email OAuth 2.0 Proxy
[Service]
ExecStart=/usr/bin/python /path/to/emailproxy.py --no-gui
Restart=always
[Install]
WantedBy=multi-user.target

sudo systemctl enable emailproxy.service --now
sudo systemctl status emailproxy.service
sudo systemctl start emailproxy.service

إذا كان الاتصال المشفر مطلوبًا ، فهذا ممكن أيضًا - ولهذا عليك أولاً إنشاء مفتاح خاص وشهادة موقعة ذاتيًا:

openssl genrsa -out key.pem 3072
openssl req -new -x509 -key key.pem -out cert.pem -days 360

ثم يتم الإشارة في emailproxy.config هذين الملفين:

local_key_path = /path/to/key.pem
local_certificate_path = /path/to/cert.pem
عودة