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