Qasje me PHP në Exchange/Office 365

Prezantuar prej kohësh - tani realitet : Microsoft ka çaktivizuar vërtetimin me fjalëkalim për protokolle të caktuara në Exchange Online nga shtatori 2022 në favor të oAuth2. Çështjet e GitHub të shumë bibliotekave dhe skripteve rezervë e bëjnë të qartë se ndryshimi kapi shumë administratorë në befasi. Më poshtë ne tregojmë një mënyrë se si mund të vazhdoni të aksesoni përmbajtjen e kutisë tuaj postare Exchange me ndihmën e oAuth2 nëpërmjet PHP nëpërmjet IMAP.


Nga pikëpamja e sigurisë, lëvizja e Microsoft është shumë korrekte, por kompleksiteti i aksesit programatik në emailet e tij është rritur mjaft. Për shembull, nëse përdorni bibliotekën barbushin/php-imap të përdorur gjerësisht, qasja dikur ishte si më poshtë:

734a82898010e2fcb02c72c3cd9702c2

Thjesht nuk funksionon më. Për të krijuar një lidhje nëpërmjet oAuth2, vështirësia e parë është të merrni shenjën e aksesit. Dhe për këtë ju duhet të përballeni me dy pengesa.

Azure Active Directory

Hapat e mëposhtëm regjistrojnë një aplikacion të ri në Azure Active Directory:

Identifikohu në https://portal.azure.com
Hapni "Azure Active Directory"
Zgjidhni "Regjistrimet e aplikacioneve" dhe "Regjistrimi i ri".
Kopjo "ID-në e aplikacionit (Klient)" (=ID-në e klientit) dhe "ID-në e drejtorisë (Qiramarrësi)" (=ID-ja e qiramarrësit).
"Lejet e API" dhe "Shto leje"
"API-të e përdorura nga organizata ime" dhe "Office 365 Exchange Online"
"Lejet e aplikacionit" dhe "IMAP.AccessAsApp"
Jep pëlqimin e administratorit
"Certifikatat dhe sekretet" & "Sekretet e klientit" & "Sekreti i ri i klientit"
Zgjidhni përshkrimin dhe vendosni vlefshmërinë
Kopjo "Secret ID" (Client Secret) në clipboard
Hapni aplikacionet e ndërmarrjeve
Kopjo "Object ID".

PowerShell

Tani e kthejmë aplikacionin në Microsoft PowerShell (Modaliteti i administratorit) dhe caktoni leje për kutitë postare individuale (<TENANTID>, <CLIENTID>, <OBJECTID>, <EMAIL> duhet të zëvendësohet në çdo rast):

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
...

Pasi ta keni bërë këtë, pjesa tjetër nuk është shkencë raketash. Meqenëse barbushin/php-imap nuk mbështet oAuth2, mund të lidheni me bibliotekën alternative Webklex/php-imap (e cila gjithashtu ka avantazhin e moskërkimit të modulit PHP IMAP ).:

734a82898010e2fcb02c72c3cd9702c2

Sidoqoftë, bibliotekat që nuk mbështesin zyrtarisht oAuth2 mund të përdoren gjithashtu me një përfaqësues si p.sh simonrob/email-oauth2-proxy e bëjnë të realizueshme. Pas kësaj Shkarko dhe instalimi nëpërmjet python -m pip install -r requirements-no-gui.txt (Kërkohet Python ≥ 3.6) ju redaktoni skedarin emailproxy.config p.sh. si më poshtë (duke zëvendësuar këtë herë <TENANTID>, <CLIENTID>, <CLIENTSECRET> dhe <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>

Pastaj filloni përfaqësuesin me python emailproxy.py --no-gui dhe tani mund të shkojë në IP pa kod localhost në port 1993 lidheni përmes Auth-it të rregullt bazë (dhe çdo fjalëkalimi të caktuar). Nëse dëshironi të nisni përfaqësuesin si shërbim në sfond kur filloni sistemin, mund ta përdorni, për shembull sistemuar:

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

Nëse kërkohet një lidhje e koduar, kjo është gjithashtu e mundur - për këtë së pari krijoni një çelës privat dhe një certifikatë të vetë-nënshkruar:

openssl genrsa -out key.pem 3072
openssl req -new -x509 -key key.pem -out cert.pem -days 360

Pastaj referenca bëhet në emailproxy.config këto dy skedarë:

local_key_path = /path/to/key.pem
local_certificate_path = /path/to/cert.pem
Mbrapa