Մուտք PHP-ի միջոցով Exchange/Office 365

Վաղուց հայտարարված , այժմ իրականություն . Microsoft-ը 2022 թվականի սեպտեմբերից անջատել է որոշակի արձանագրությունների գաղտնաբառով նույնականացումը Exchange Online-ում՝ հօգուտ oAuth2-ի: Շատ գրադարանների և պահեստային սցենարների GitHub-ի խնդիրները պարզ են դարձնում, որ փոփոխությունը զարմացրել է շատ ադմինիստրատորների: Ստորև մենք ցույց ենք տալիս մի միջոց, թե ինչպես կարող եք շարունակել մուտք գործել ձեր Exchange փոստարկղի բովանդակությունը oAuth2-ի օգնությամբ PHP-ի միջոցով IMAP-ի միջոցով:


Անվտանգության տեսանկյունից Microsoft-ի քայլը շատ ճիշտ է, բայց նրա էլ. փոստին ծրագրային հասանելիության բարդությունը բավականին մեծացել է։ Օրինակ, եթե դուք օգտագործում եք լայնորեն օգտագործվող barbushin/php-imap գրադարանը , մուտքը նախկինում հետևյալն էր.:

734a82898010e2fcb02c72c3cd9702c2

Դա պարզապես այլեւս չի աշխատում: oAuth2-ի միջոցով կապ հաստատելու համար առաջին դժվարությունը մուտքի նշան ստանալն է: Եվ դրա համար դուք պետք է դիմեք երկու խոչընդոտների:

Azure Active Directory

Հետևյալ քայլերը գրանցում են նոր հավելված Azure Active Directory-ում:

Մուտք գործեք https://portal.azure.com
Բացեք «Azure Active Directory»
Ընտրեք «Հավելվածների գրանցումներ» և «Նոր գրանցում»:
Պատճենեք «Application ID (Client)» (=Client ID) & «Directory ID (Tenant)» (=Վարձակալի ID):
«API թույլտվություններ» և «Ավելացնել թույլտվություն»
«Իմ կազմակերպության կողմից օգտագործվող API-ներ» և «Office 365 Exchange Online»
«Հավելվածի թույլտվություններ» և «IMAP.AccessAsApp»
Տրամադրել ադմինիստրատորի համաձայնությունը
«Վկայականներ և գաղտնիքներ» և «Հաճախորդի գաղտնիքներ» և «Նոր հաճախորդի գաղտնիք»
Ընտրեք նկարագրությունը և սահմանեք վավերականությունը
Պատճենեք «Գաղտնի ID»-ն (Client Secret) clipboard-ում
Բացեք ձեռնարկության հավելվածները
Պատճենեք «Օբյեկտի ID-ն»:

PowerShell

Այժմ մենք միացնում ենք հավելվածը Microsoft PowerShell (Ադմինիստրատորի ռեժիմ) և թույլտվություններ տրամադրեք առանձին փոստարկղերին (<TENANTID>, <CLIENTID>, <OBJECTID>, <EMAIL> պետք է փոխարինվի յուրաքանչյուր դեպքում):

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

Երբ դուք դա արել եք, մնացածը հրթիռային գիտություն չէ: Քանի որ barbushin/php-imap- ը չի աջակցում oAuth2-ին, դուք կարող եք միանալ Webklex/php-imap այլընտրանքային գրադարանի հետ (որն ունի նաև PHP IMAP մոդուլ չպահանջելու առավելությունը)::

734a82898010e2fcb02c72c3cd9702c2

Այնուամենայնիվ, գրադարանները, որոնք պաշտոնապես չեն աջակցում oAuth2-ին, կարող են օգտագործվել նաև վստահված անձի հետ, ինչպիսին է simonrob/email-oauth2-proxy դարձնել այն գործունակ: Սրանից հետո Բեռնել և տեղադրումը միջոցով python -m pip install -r requirements-no-gui.txt (Պահանջվում է Python ≥3.6) դուք խմբագրում եք ֆայլը emailproxy.config օրինակ՝ հետևյալ կերպ (փոխարինելով այս անգամ <TENANTID>, <CLIENTID>, <CLIENTSECRET> և <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>

Այնուհետև դուք սկսում եք վստահված անձը python emailproxy.py --no-gui և այժմ կարող է չգաղտնագրված անցնել IP-ին localhost նավահանգստի վրա 1993 միացեք սովորական Հիմնական վավերացման միջոցով (և ցանկացած գաղտնաբառի հավաքածու): Եթե ​​ցանկանում եք գործարկել վստահված անձը որպես ծառայություն ֆոնային ռեժիմում, երբ սկսում եք համակարգը, կարող եք օգտագործել, օրինակ համակարգված:

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

Եթե ​​անհրաժեշտ է գաղտնագրված կապ, դա նույնպես հնարավոր է. դրա համար նախ ստեղծեք անձնական բանալի և ինքնաստորագրված վկայագիր:

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

Այնուհետև հղում է կատարվում emailproxy.config այս երկու ֆայլերը:

local_key_path = /path/to/key.pem
local_certificate_path = /path/to/cert.pem
Վերադառնալ