Hozzáférés PHP-vel az Exchange/Office 365-höz

Régóta bejelentettimmár valóság : A Microsoft 2022 szeptemberétől kikapcsolta a jelszóval történő hitelesítést az Exchange Online bizonyos protokolljainál az oAuth2 javára. Számos könyvtár GitHub-problémája és biztonsági mentési szkriptje egyértelművé teszi, hogy az átállás sok rendszergazdát meglepett. Az alábbiakban bemutatjuk, hogyan érheti el továbbra is Exchange-postafiókja tartalmát az oAuth2 segítségével PHP-n keresztül IMAP-on keresztül.


Biztonsági szempontból a Microsoft lépése nagyon helyes, de az e-mailekhez való programozott hozzáférés bonyolultsága meglehetősen megnőtt. Például, ha a széles körben használt barbushin/php-imap könyvtárat használja, a hozzáférés a következőképpen zajlott:

734a82898010e2fcb02c72c3cd9702c2

Egyszerűen már nem megy. Az oAuth2-n keresztüli kapcsolat létrehozásához az első nehézséget a hozzáférési jogkivonat beszerzése jelenti. Ehhez pedig két akadályt kell felvenni.

Azure Active Directory

A következő lépésekkel regisztrálhat egy új alkalmazást az Azure Active Directoryban:

Bejelentkezés ide: https://portal.azure.com
Nyissa meg az "Azure Active Directory"
Válassza az „Alkalmazásregisztráció” és az „Új regisztráció” lehetőséget.
Másolja ki az "Application ID (Client)" (=Ügyfélazonosító) és a "Directory ID (Bérlő)" (=Bérlő azonosítója).
"API engedélyek" és "Engedély hozzáadása"
„A szervezetem által használt API-k” és „Office 365 Exchange Online”
„Alkalmazásengedélyek” és „IMAP.AccessAsApp”
Adja meg a rendszergazda hozzájárulását
„Tanúsítványok és titkok” és „Ügyféltitkok” és „Új ügyféltitkok”
Válassza ki a leírást és állítsa be az érvényességet
Másolja a "Titkos azonosítót" (Client Secret) a vágólapra
Nyissa meg a vállalati alkalmazásokat
Másolja az "Object ID"-t.

PowerShell

Most kapcsoljuk be az alkalmazást a Microsoft PowerShell (Rendszergazda mód), és rendeljen engedélyeket az egyes postafiókokhoz (<TENANTID>, <CLIENTID>, <OBJECTID>, <EMAIL> minden esetben ki kell cserélni):

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

Ha ezt megtette, a többi már nem rakétatudomány. Mivel a barbushin/php-imap nem támogatja az oAuth2-t, csatlakozhat a Webklex/php-imap alternatív könyvtárhoz (amelynek megvan az az előnye is, hogy nincs szüksége a PHP IMAP modulra ).:

734a82898010e2fcb02c72c3cd9702c2

Az oAuth2-t hivatalosan nem támogató könyvtárak azonban olyan proxyval is használhatók, mint pl simonrob/email-oauth2-proxy működőképessé tegye. Ezt követően Letöltés és a telepítés keresztül python -m pip install -r requirements-no-gui.txt (Python ≥3.6 szükséges) szerkesztheti a fájlt emailproxy.config például az alábbiak szerint (ezt az időt helyettesítve <TENANTID>, <CLIENTID>, <CLIENTSECRET> és <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>

Ezután elindítja a proxyt a python emailproxy.py --no-gui és most már titkosítatlanul tud menni az IP-címre localhost a kikötőben 1993 csatlakozzon a szokásos alapszintű hitelesítéssel (és bármilyen beállított jelszóval). Ha a proxyt szolgáltatásként szeretnénk elindítani a háttérben a rendszer indításakor, használhatjuk pl 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

Ha titkosított kapcsolat szükséges, ez is lehetséges - ehhez először létre kell hozni egy privát kulcsot és egy önaláírt tanúsítványt:

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

Ezután hivatkozás történik a emailproxy.config ezt a két fájlt:

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