دسترسی با PHP به Exchange/Office 365

مدت ها اعلام شد - اکنون واقعیت : مایکروسافت احراز هویت با رمز عبور را برای پروتکل های خاص در Exchange Online از سپتامبر 2022 به نفع oAuth2 خاموش کرده است. مشکلات GitHub بسیاری از کتابخانه‌ها و اسکریپت‌های پشتیبان نشان می‌دهد که تغییر، بسیاری از مدیران را غافلگیر کرده است. در زیر روشی را نشان می دهیم که چگونه می توانید با کمک oAuth2 از طریق PHP از طریق IMAP به محتویات صندوق پستی Exchange خود دسترسی داشته باشید.


از نظر امنیتی، حرکت مایکروسافت بسیار درست است، اما پیچیدگی دسترسی برنامه‌ای به ایمیل‌های آن بسیار افزایش یافته است. به عنوان مثال، اگر از کتابخانه پرکاربرد barbushin/php-imap استفاده می کنید، دسترسی به شکل زیر بود.:

734a82898010e2fcb02c72c3cd9702c2

فقط دیگه کار نمیکنه برای برقراری ارتباط از طریق oAuth2، اولین مشکل دریافت رمز دسترسی است. و برای این شما باید دو مانع را تحمل کنید.

Azure Active Directory

مراحل زیر یک برنامه جدید را در Azure Active Directory ثبت می کند:

ورود به https://portal.azure.com
"Azure Active Directory" را باز کنید
"ثبت نام های برنامه" و "ثبت نام جدید" را انتخاب کنید.
"Application ID (Client)" (=Client ID) & "Directory ID (Tenant)" (=Tenant ID) را کپی کنید.
"مجوزهای API" و "Add Permission"
"API های استفاده شده توسط سازمان من" و "Office 365 Exchange Online"
"مجوزهای برنامه" و "IMAP.AccessAsApp"
اعطای رضایت مدیر
"گواهینامه ها و اسرار" و "رازهای مشتری" و "راز مشتری جدید"
توضیحات را انتخاب کنید و اعتبار را تنظیم کنید
"Secret ID" (Client Secret) را در کلیپ بورد کپی کنید
باز کردن برنامه های کاربردی سازمانی
"شناسه شی" را کپی کنید.

پاورشل

اکنون برنامه را در داخل می کنیم Microsoft PowerShell (حالت مدیر) و مجوزها را به صندوق های پستی اختصاص دهید (<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/email-oauth2-proxy آن را قابل اجرا کند. بعد از این دانلود و نصب از طریق 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 از طریق پایه معمولی Auth (و هر مجموعه رمز عبور) متصل شوید. اگر می خواهید هنگام راه اندازی سیستم، پروکسی را به عنوان یک سرویس در پس زمینه راه اندازی کنید، می توانید برای مثال از آن استفاده کنید سیستم شده:

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
بازگشت