Aliro per PHP al Exchange/Office 365

Longe anoncite - nun realaĵo : Microsoft malŝaltis aŭtentikigon per pasvorto por iuj protokoloj en Exchange Online ekde septembro 2022 favore al oAuth2. La GitHub-problemoj de multaj bibliotekoj kaj rezervaj skriptoj klarigas, ke la ŝanĝo surprizis multajn administrantojn. Malsupre ni montras manieron kiel vi povas daŭrigi aliri la enhavon de via Exchange-leterkesto helpe de oAuth2 per PHP per IMAP.


El sekureca vidpunkto, la movo de Mikrosofto estas tre ĝusta, sed la komplekseco de programa aliro al ĝiaj retpoŝtoj sufiĉe pliiĝis. Ekzemple, se vi uzas la vaste uzatan barbushin/php-imap-bibliotekon , aliro kutimis esti jena:

734a82898010e2fcb02c72c3cd9702c2

Ĝi simple ne plu funkcias. Por establi konekton per oAuth2, la unua malfacilaĵo estas akiri la alirĵetonon. Kaj por tio vi devas preni sur du hurdojn.

Azure Active Directory

La sekvaj paŝoj registras novan apon en Azure Active Directory:

Ensalutu al https://portal.azure.com
Malfermu la "Azure Active Directory"
Elektu "Registriĝoj de la aplikaĵo" & "Nova registrado".
Kopiu "Aplika ID (Kliento)" (=Kliento ID) & "Adresaro ID (Luanto)" (=Loanto ID).
"API-Permesoj" & "Aldoni Permeson"
"APIoj uzataj de mia organizo" & "Office 365 Exchange Online"
"Aplikaj Permesiloj" & "IMAP.AccessAsApp"
Donu administran konsenton
"Atestiloj & Sekretoj" & "Kliento Sekretoj" & "Nova Kliento Sekreto"
Elektu priskribon kaj starigu validecon
Kopiu "Sekret ID" (Klienta Sekreto) al la tondujo
Malfermu entreprenajn aplikaĵojn
Kopiu "Objekta ID".

PowerShell

Nun ni turnas la apon en la Microsoft PowerShell (Administra reĝimo) kaj asigni permesojn al la individuaj leterkestoj (<TENANTID>, <CLIENTID>, <OBJECTID>, <EMAIL> devas esti anstataŭigita en ĉiu kazo):

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

Post kiam vi faris tion, la resto ne estas raketscienco. Ĉar barbushin/php-imap ne subtenas oAuth2, vi povas konektiĝi kun la alternativa biblioteko Webklex/php-imap (kiu ankaŭ havas la avantaĝon ne postuli la PHP-IMAP-modulon ).:

734a82898010e2fcb02c72c3cd9702c2

Tamen, bibliotekoj kiuj ne oficiale subtenas oAuth2 ankaŭ povas esti uzataj kun prokurilo kiel ekzemple simonrob/email-oauth2-proxy fari ĝin realigebla. Post ĉi tio Elŝutu kaj la instalado per python -m pip install -r requirements-no-gui.txt (Python ≥3.6 bezonata) vi redaktas la dosieron emailproxy.config ekz. jene (anstataŭigante ĉi tiun fojon <TENANTID>, <CLIENTID>, <CLIENTSECRET> kaj <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>

Tiam vi komencas la prokurilon per python emailproxy.py --no-gui kaj nun povas iri al la IP neĉifrita localhost sur haveno 1993 konekti per regula Basic Auth (kaj ajna pasvorta aro). Se vi volas komenci la prokurilon kiel servon en la fono kiam vi ekfunkciigas la sistemon, vi povas uzi, ekzemple 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

Se necesas ĉifrita konekto, tio ankaŭ eblas - por tio vi unue kreas privatan ŝlosilon kaj memsubskribitan atestilon.:

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

Tiam referenco estas farita en la emailproxy.config ĉi tiuj du dosieroj:

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