Anunțat de mult - acum realitate : Microsoft a dezactivat autentificarea prin parolă pentru anumite protocoale din Exchange Online din septembrie 2022 în favoarea oAuth2. Problemele GitHub ale multor biblioteci și scripturi de rezervă arată clar că schimbarea i-a surprins pe mulți administratori. Mai jos arătăm o modalitate prin care puteți continua să accesați conținutul căsuței dvs. poștale Exchange cu ajutorul oAuth2 prin PHP prin IMAP.
Din punct de vedere al securității, mișcarea Microsoft este foarte corectă, dar complexitatea accesului programatic la e-mailurile sale a crescut destul de mult. De exemplu, dacă utilizați biblioteca barbushin/php-imap folosită pe scară largă, accesul era după cum urmează:
734a82898010e2fcb02c72c3cd9702c2
Pur și simplu nu mai funcționează. Pentru a stabili o conexiune prin oAuth2, prima dificultate este obținerea jetonului de acces. Și pentru asta trebuie să învingi două obstacole.
Azure Active Directory
Următorii pași înregistrează o nouă aplicație în Azure Active Directory:













PowerShell
Acum transformăm aplicația în Microsoft PowerShell (mod Administrator) și atribuiți permisiuni căsuțelor poștale individuale (<TENANTID>, <CLIENTID>, <OBJECTID>, <EMAIL> trebuie înlocuit în fiecare caz):
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
...
Odată ce ai făcut asta, restul nu este știință rachetă. Deoarece barbushin/php-imap nu acceptă oAuth2, vă puteți conecta cu biblioteca alternativă Webklex/php-imap (care are și avantajul de a nu necesita modulul PHP IMAP ).:
734a82898010e2fcb02c72c3cd9702c2
Cu toate acestea, bibliotecile care nu acceptă oficial oAuth2 pot fi utilizate și cu un proxy, cum ar fi simonrob/email-oauth2-proxy fă-l funcțional. Dupa asta Descarca iar instalarea prin python -m pip install -r requirements-no-gui.txt (Este necesar Python ≥3.6) editați fișierul emailproxy.config de exemplu, după cum urmează (înlocuind această dată <TENANTID>, <CLIENTID>, <CLIENTSECRET> și <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>
Apoi începeți proxy-ul cu python emailproxy.py --no-gui și acum poate merge la IP-ul necriptat localhost pe port 1993 conectați-vă prin autentificare de bază obișnuită (și orice set de parolă). Dacă doriți să porniți proxy-ul ca serviciu în fundal atunci când porniți sistemul, puteți utiliza, de exemplu 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
Dacă este necesară o conexiune criptată, acest lucru este și posibil - pentru aceasta creați mai întâi o cheie privată și un certificat autosemnat:
openssl genrsa -out key.pem 3072
openssl req -new -x509 -key key.pem -out cert.pem -days 360
Apoi se face referire în emailproxy.config aceste două dosare:
local_key_path = /path/to/key.pem
local_certificate_path = /path/to/cert.pem
Trimiterea de e-mailuri
Oricine dorește să trimită e-mailuri programatic prin Microsoft Exchange Online se confruntă și cu o schimbare fundamentală: Microsoft a dezactivat autentificarea clasică cu nume de utilizator și parolă pentru SMTP în Exchange Online. Ceea ce se realiza cu doar câteva linii de cod timp de ani de zile necesită acum o deviere prin OAuth2 – inclusiv înregistrarea aplicațiilor în Azure Active Directory, certificatele și gestionarea token-urilor. Putem implementa aceeași abordare pentru trimiterea de e-mailuri, pe lângă primirea acestora.




Trimiterea SMTP prin Microsoft Exchange 365 urmează același principiu ca și accesul IMAP: De la dezactivarea autentificării de bază, nu există alternativă la OAuth2. După adăugarea permisiunii „SMTP.SendAsApp” în înregistrarea aplicației Azure și acordarea aprobării administratorului, trimiterea se poate face, de exemplu, cu... PHPMailer Acest lucru este implementat. În loc să se introducă pur și simplu un nume de utilizator și o parolă, ca înainte, autentificarea pe serverul SMTP utilizează acum un token de acces. smtp.office365.com:
734a82898010e2fcb02c72c3cd9702c2
Efortul suplimentar de configurare poate părea inițial descurajant, dar pe termen lung se meritează: autentificarea bazată pe OAuth2 este semnificativ mai sigură, deoarece nu este nevoie să fie stocate parole în text simplu în fișiere de configurare sau scripturi – iar token-ul de acces poate fi, de asemenea, limitat în timp, iar permisiunile sale pot fi controlate cu precizie granulară. De asemenea, merită menționată aici biblioteca mailhelper , care oferă o API convenabilă pentru primirea și trimiterea de e-mailuri.