Længe annonceret - nu virkelighed : Microsoft har slået autentificering med adgangskode fra for visse protokoller i Exchange Online fra september 2022 til fordel for oAuth2. GitHub-problemerne i mange biblioteker og backup-scripts gør det klart, at skiftet overraskede mange administratorer. Nedenfor viser vi en måde, hvordan du kan fortsætte med at få adgang til indholdet af din Exchange-postkasse ved hjælp af oAuth2 via PHP via IMAP.
Fra et sikkerhedssynspunkt er Microsofts træk meget korrekt, men kompleksiteten af programmatisk adgang til dets e-mails er steget en del. For eksempel, hvis du bruger det meget udbredte barbushin/php-imap bibliotek , plejede adgangen at være som følger:
734a82898010e2fcb02c72c3cd9702c2
Det er ikke længere så simpelt. Oprettelse af en forbindelse via OAuth2 kræver nu først at få adgangstokenet. Dette nødvendiggør overvindelse af to forhindringer.
Azure Active Directory
Følgende trin registrerer en ny app i Azure Active Directory:













PowerShell
Nu slår vi appen ind Microsoft PowerShell (Administratortilstand) og tildel tilladelser til de individuelle postkasser (<TENANTID>, <CLIENTID>, <OBJECTID>, <EMAIL> skal udskiftes i hvert enkelt tilfælde):
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 det er gjort, er resten en leg. Da barbushin/php-imap ikke understøtter oAuth2, kan du for eksempel oprette en forbindelse ved hjælp af det alternative bibliotek Webklex/php-imap (som også har den fordel, at det ikke kræver PHP IMAP-modulet ).:
734a82898010e2fcb02c72c3cd9702c2
Men biblioteker, der ikke officielt understøtter oAuth2, kan også bruges ved hjælp af en proxy som simonrob/email-oauth2-proxy gøre det brugbart. Efter dette Hent og installationen via python -m pip install -r requirements-no-gui.txt (Python ≥3.6 påkrævet) redigerer du filen emailproxy.config fx som følger (erstatter denne gang <TENANTID>, <CLIENTID>, <CLIENTSECRET> og <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>
Så starter du proxyen med python emailproxy.py --no-gui og kan nu gå til IP'en ukrypteret localhost på havn 1993 opret forbindelse via almindelig Basic Auth (og en hvilken som helst adgangskode). Hvis du vil starte proxyen som en tjeneste i baggrunden, når du starter systemet, kan du bruge f.eks 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
Hvis en krypteret forbindelse er påkrævet, er dette også muligt - til dette opretter du først en privat nøgle og et selvsigneret certifikat:
openssl genrsa -out key.pem 3072
openssl req -new -x509 -key key.pem -out cert.pem -days 360
Derefter henvises der i emailproxy.config disse to filer:
local_key_path = /path/to/key.pem
local_certificate_path = /path/to/cert.pem
Afsendelse af e-mail
Enhver, der ønsker at sende e-mails programmatisk via Microsoft Exchange Online, står også over for en fundamental ændring: Microsoft har deaktiveret klassisk brugernavn- og adgangskodegodkendelse til SMTP i Exchange Online. Hvad der i årevis blev opnået med blot et par linjer kode, kræver nu omvejen via OAuth2 – inklusive appregistrering i Azure Active Directory, certifikater og tokenhåndtering. Vi kan implementere den samme tilgang til at sende e-mails, udover at modtage dem.




SMTP-afsendelse via Microsoft Exchange 365 følger samme princip som IMAP-adgang: heller ikke her er der ingen vej uden om oAuth2, da Basic Authentication blev slået fra. Efter tilføjelse af "SMTP.SendAsApp"-tilladelsen i Azure-appregistreringen og givet administratorsamtykke, kan afsendelse udføres, f.eks. PHPMailer Dette er implementeret. I stedet for blot at indtaste et brugernavn og en adgangskode som før, bruger godkendelse mod SMTP-serveren nu et adgangstoken. smtp.office365.com:
734a82898010e2fcb02c72c3cd9702c2
Den ekstra opsætningsindsats kan i starten virke skræmmende, men det betaler sig i det lange løb: OAuth2-baseret godkendelse er betydeligt mere sikker, da der ikke skal gemmes adgangskoder i klartekst i konfigurationsfiler eller scripts – og adgangstokenet kan også tidsbegrænses, og dets tilladelser kan kontrolleres med granulær præcision. Det er også værd at nævne mailhelper- biblioteket, som tilbyder en praktisk API til modtagelse og afsendelse af e-mails.