Åtkomst med PHP till Exchange/Office 365

Länge meddelat - nu verklighet : Microsoft har stängt av autentisering med lösenord för vissa protokoll i Exchange Online från september 2022 till förmån för oAuth2. GitHub-problemen i många bibliotek och säkerhetskopieringsskript gör det klart att övergången överraskade många administratörer. Nedan visar vi ett sätt hur du kan fortsätta komma åt innehållet i din Exchange-postlåda med hjälp av oAuth2 via PHP via IMAP.


Ur säkerhetssynpunkt är Microsofts drag mycket korrekt, men komplexiteten i programmatisk åtkomst till dess e-post har ökat en hel del. Till exempel, om du använder det mycket använda barbushin/php-imap-biblioteket , brukade åtkomsten vara följande:

734a82898010e2fcb02c72c3cd9702c2

Det fungerar bara inte längre. För att upprätta en anslutning via oAuth2 är den första svårigheten att få åtkomsttoken. Och för detta måste du ta dig an två hinder.

Azure Active Directory

Följande steg registrerar en ny app i Azure Active Directory:

Logga in på https://portal.azure.com
Öppna "Azure Active Directory"
Välj "App registreringar" & "Ny registrering".
Kopiera "Applikations-ID (klient)" (=klient-ID) & "Katalog-ID (hyresgäst)" (=hyresgäst-ID).
"API-behörigheter" & "Lägg till behörighet"
"API som används av min organisation" & "Office 365 Exchange Online"
"Applicenser" & "IMAP.AccessAsApp"
Ge administratörens samtycke
"Certificates & Secrets" & "Client Secrets" & "New Client Secret"
Välj beskrivning och ställ in giltighet
Kopiera "Secret ID" (Client Secret) till urklippet
Öppna företagsapplikationer
Kopiera "Objekt-ID".

PowerShell

Nu vänder vi appen i Microsoft PowerShell (Administratörsläge) och tilldela behörigheter till de individuella brevlådorna (<TENANTID>, <CLIENTID>, <OBJECTID>, <EMAIL> måste bytas ut i varje fall):

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

När du väl har gjort det är resten inte raketvetenskap. Eftersom barbushin/php-imap inte stöder oAuth2 kan du ansluta till det alternativa biblioteket Webklex/php-imap (som också har fördelen att inte kräva PHP IMAP-modulen ).:

734a82898010e2fcb02c72c3cd9702c2

Däremot kan bibliotek som inte officiellt stöder oAuth2 också användas med en proxy som t.ex simonrob/email-oauth2-proxy göra det fungerande. Efter det här Ladda ner och installationen via python -m pip install -r requirements-no-gui.txt (Python ≥3.6 krävs) du redigerar filen emailproxy.config t.ex. enligt följande (ersätter den här gången <TENANTID>, <CLIENTID>, <CLIENTSECRET> och <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>

Sedan startar du proxyn med python emailproxy.py --no-gui och kan nu gå till IP:n okrypterad localhost på hamn 1993 ansluta via vanlig Basic Auth (och valfritt lösenord). Om du vill starta proxyn som en tjänst i bakgrunden när du startar systemet kan du använda t.ex 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

Om en krypterad anslutning krävs är detta också möjligt - för detta skapar du först en privat nyckel och ett självsignerat certifikat:

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

Då hänvisas till i emailproxy.config dessa två filer:

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