Acces cu PHP la Exchange/Office 365

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

Nu mai este atât de simplu. Stabilirea unei conexiuni prin OAuth2 necesită acum obținerea mai întâi a token-ului de acces. Acest lucru necesită depășirea a două obstacole.

Azure Active Directory

Următorii pași înregistrează o nouă aplicație în Azure Active Directory:

Conectați-vă la https://portal.azure.com
Deschideți „Azure Active Directory”
Selectați „Înregistrări aplicații” și „Înregistrare nouă”.
Copiați „ID aplicație (client)” (=ID client) și „ID director (chiriaș)” (=ID chiriaș).
„Permisiuni API” și „Adăugați permisiunea”
„API-uri utilizate de organizația mea” și „Office 365 Exchange Online”
„Permisiuni de aplicație” și „IMAP.AccessAsApp”
Acordați consimțământul administratorului
„Certificate și secrete” și „Secrete client” și „Secret client nou”
Alegeți descrierea și setați valabilitatea
Copiați „Secret ID” (Secret client) în clipboard
Deschideți aplicații pentru întreprinderi
Copiați „ID obiect”.

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 asta ai făcut, restul e floare la ureche. Deoarece barbushin/php-imap nu suportă oAuth2, poți, de exemplu, să stabilești o conexiune folosind biblioteca alternativă Webklex/php-imap (care are și avantajul că nu necesită modulul PHP IMAP ).:

734a82898010e2fcb02c72c3cd9702c2

Dar bibliotecile care nu acceptă oficial oAuth2 pot fi folosite și cu ajutorul unui proxy ca 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.

„Permisiuni API” și „Adăugați permisiunea”
„API-uri utilizate de organizația mea” și „Office 365 Exchange Online”
„Permisiuni aplicație” și „SMTP.SendAsApp”
Acordați consimțământul administratorului

Trimiterea SMTP prin Microsoft Exchange 365 urmează același principiu ca și accesul IMAP: nici aici nu există nicio cale de a ocoli oAuth2, deoarece autentificarea de bază a fost dezactivată. După adăugarea permisiunii „SMTP.SendAsApp” în înregistrarea aplicației Azure și acordarea consimțământului administratorului, trimiterea poate fi efectuată, de exemplu 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.

Înapoi