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

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:

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 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
Înapoi