Toegang met PHP tot Exchange/Office 365

Lang aangekondigd - nu realiteit : Microsoft heeft authenticatie met wachtwoord voor bepaalde protocollen in Exchange Online vanaf september 2022 uitgeschakeld ten gunste van oAuth2. De GitHub-uitgaven van veel bibliotheken en back-upscripts maken duidelijk dat de omschakeling veel beheerders verraste. Hieronder laten we zien hoe je met behulp van oAuth2 via PHP en IMAP toegang kunt blijven krijgen tot de inhoud van je Exchange mailbox.


Vanuit veiligheidsoogpunt is de zet van Microsoft zeer correct, maar de complexiteit van programmatische toegang tot zijn e-mails is behoorlijk toegenomen. Als u bijvoorbeeld de veelgebruikte barbushin/php-imap-bibliotheek gebruikt, was de toegang als volgt::

734a82898010e2fcb02c72c3cd9702c2

Het werkt gewoon niet meer. Om een ​​verbinding via oAuth2 tot stand te brengen, is de eerste moeilijkheid om het toegangstoken te krijgen. En daarvoor moet je twee hindernissen nemen.

Azure Active Directory

De volgende stappen registreren een nieuwe app in Azure Active Directory:

Log in op https://portal.azure.com
Open de "Azure Active Directory"
Selecteer "App-registraties" & "Nieuwe registratie".
Kopieer "Applicatie-ID (Client)" (=Client-ID) & "Directory-ID (Tenant)" (=Tenant-ID).
"API-machtigingen" & "Toestemming toevoegen"
"API's gebruikt door mijn organisatie" & "Office 365 Exchange Online"
"Toepassingsmachtigingen" & "IMAP.AccessAsApp"
Beheer toestemming verlenen
"Certificaten en geheimen" & "Klantgeheimen" & "Nieuw klantgeheim"
Kies een beschrijving en stel de geldigheid in
Kopieer "Secret ID" (Client Secret) naar het klembord
Bedrijfsapplicaties openen
Kopieer "Object-ID".

PowerShell

Nu zetten we de app in de Microsoft PowerShell (Beheerdermodus) en wijs machtigingen toe aan de individuele mailboxen (<TENANTID>, <CLIENTID>, <OBJECTID>, <EMAIL> moet in elk geval worden vervangen):

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

Als je dat eenmaal hebt gedaan, is de rest geen rocket science. Aangezien barbushin/php-imap oAuth2 niet ondersteunt, kunt u verbinding maken met de alternatieve bibliotheek Webklex/php-imap (die ook het voordeel heeft dat de PHP IMAP-module niet nodig is).:

734a82898010e2fcb02c72c3cd9702c2

Bibliotheken die oAuth2 officieel niet ondersteunen, kunnen echter ook worden gebruikt met een proxy zoals: simonrob/e-mail-oauth2-proxy werkbaar maken. Na dit Downloaden en de installatie via python -m pip install -r requirements-no-gui.txt (Python ≥3.6 vereist) u bewerkt het bestand emailproxy.config bijvoorbeeld als volgt (ter vervanging van deze tijd) <TENANTID>, <CLIENTID>, <CLIENTSECRET> en <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>

Dan start je de proxy met python emailproxy.py --no-gui en kan nu onversleuteld naar het IP gaan localhost op poort 1993 verbinding maken via gewone basisverificatie (en elk wachtwoord dat is ingesteld). Als u de proxy als een service op de achtergrond wilt starten wanneer u het systeem start, kunt u bijvoorbeeld systeemd:

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

Als er een versleutelde verbinding nodig is, is dat ook mogelijk - hiervoor maak je eerst een privésleutel en een zelfondertekend certificaat aan:

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

Dan wordt er verwezen naar de emailproxy.config deze twee bestanden:

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