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

Dërgimi i email-eve

Kushdo që dëshiron të dërgojë email-e në mënyrë programore nëpërmjet Microsoft Exchange Online po përballet gjithashtu me një ndryshim themelor: Microsoft ka çaktivizuar vërtetimin klasik të emrit të përdoruesit dhe fjalëkalimit për SMTP në Exchange Online. Ajo që është arritur me vetëm disa rreshta kodi për vite me radhë, tani kërkon devijimin nëpërmjet OAuth2 - duke përfshirë regjistrimin e aplikacionit në Azure Active Directory, certifikatat dhe menaxhimin e token-eve. Ne mund të zbatojmë të njëjtën qasje për dërgimin e email-eve, përveç marrjes së tyre.

"Lejet e API" dhe "Shto leje"
"API-të e përdorura nga organizata ime" dhe "Office 365 Exchange Online"
"Lejet e aplikacionit" dhe "SMTP.SendAsApp"
Jep pëlqimin e administratorit

Dërgimi SMTP nëpërmjet Microsoft Exchange 365 ndjek të njëjtin parim si qasja IMAP: Që nga çaktivizimi i Autentifikimit Bazë, nuk ka alternativë ndaj OAuth2. Pas shtimit të lejes "SMTP.SendAsApp" në regjistrimin e aplikacionit Azure dhe dhënies së miratimit të administratorit, dërgimi mund të bëhet, për shembull, me... PHPMailer Kjo është zbatuar. Në vend që thjesht të paraqitet një emër përdoruesi dhe fjalëkalim si më parë, vërtetimi kundrejt serverit SMTP tani përdor një token aksesi. smtp.office365.com:

734a82898010e2fcb02c72c3cd9702c2

Përpjekja shtesë për konfigurim mund të duket fillimisht e frikshme, por në planin afatgjatë ia vlen: Autentifikimi i bazuar në OAuth2 është dukshëm më i sigurt, pasi nuk ka nevojë të ruhen fjalëkalime me tekst të thjeshtë në skedarë konfigurimi ose skripte - dhe tokeni i aksesit mund të jetë gjithashtu i kufizuar në kohë dhe lejet e tij të kontrollohen me saktësi të detajuar. Gjithashtu, vlen të përmendet këtu biblioteka mailhelper , e cila ofron një API të përshtatshëm për marrjen dhe dërgimin e email-eve.

Mbrapa