مدت ها اعلام شد - اکنون واقعیت : مایکروسافت احراز هویت با رمز عبور را برای پروتکل های خاص در Exchange Online از سپتامبر 2022 به نفع oAuth2 خاموش کرده است. مشکلات GitHub بسیاری از کتابخانهها و اسکریپتهای پشتیبان نشان میدهد که تغییر، بسیاری از مدیران را غافلگیر کرده است. در زیر روشی را نشان می دهیم که چگونه می توانید با کمک oAuth2 از طریق PHP از طریق IMAP به محتویات صندوق پستی Exchange خود دسترسی داشته باشید.
از نظر امنیتی، حرکت مایکروسافت بسیار درست است، اما پیچیدگی دسترسی برنامهای به ایمیلهای آن بسیار افزایش یافته است. به عنوان مثال، اگر از کتابخانه پرکاربرد barbushin/php-imap استفاده می کنید، دسترسی به شکل زیر بود.:
734a82898010e2fcb02c72c3cd9702c2
فقط دیگه کار نمیکنه برای برقراری ارتباط از طریق oAuth2، اولین مشکل دریافت رمز دسترسی است. و برای این شما باید دو مانع را تحمل کنید.
Azure Active Directory
مراحل زیر یک برنامه جدید را در Azure Active Directory ثبت می کند:
پاورشل
اکنون برنامه را در داخل می کنیم 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