PHP менен Exchange/Office 365ке кирүү

Көптөн бери жарыяланган - азыр чындык : Microsoft 2022-жылдын сентябрынан тартып oAuth2 пайдасына Exchange Online'дагы айрым протоколдор үчүн сырсөз менен аутентификацияны өчүрдү. Көптөгөн китепканалардын жана резервдик скрипттердин GitHub маселелери, өзгөртүү көптөгөн администраторлорду таң калтырганын ачык көрсөтүп турат. Төмөндө биз IMAP аркылуу PHP аркылуу oAuth2 жардамы менен Exchange почта ящигиңиздин мазмунуна кантип жетүүнү улантсаңыз болорун көрсөтөбүз.


Коопсуздук көз карашынан алганда, Microsoftтун кадамы абдан туура, бирок анын электрондук почталарына программалык кирүүнүн татаалдыгы бир аз көбөйдү. Мисалы, эгер сиз кеңири колдонулган barbushin/php-imap китепканасын колдонсоңуз , кирүү төмөнкүдөй болгон.:

734a82898010e2fcb02c72c3cd9702c2

Бул жөн эле иштебейт. oAuth2 аркылуу байланыш түзүү үчүн, биринчи кыйынчылык - жетүү белгисин алуу. Ал эми бул үчүн сиз эки тоскоолдуктан өтүшүңүз керек.

Azure Active Directory

Төмөнкү кадамдар Azure Active Directoryде жаңы колдонмону каттайт:

https://portal.azure.com кирүү
"Azure Active Directory" ачуу
"Колдонмону каттоо" жана "Жаңы каттоо" тандаңыз.
"Колдонмонун идентификатору (кардар)" (=Кардардын ID) жана "Каталог ID (Ижарачы)" (=Ижарачы ID) көчүрүңүз.
"API уруксаттары" & "Уруксат кошуу"
"Менин уюмум колдонгон API'лер" & "Office 365 Exchange Online"
"Колдонмого уруксаттар" жана "IMAP.AccessAsApp"
Администратордун макулдугун бериңиз
"Сертификаттар жана сырлар" & "Кардар сырлары" & "Жаңы кардар сыры"
Сүрөттөмөнү тандап, жарактуулугун белгилеңиз
Алмашуу буферине "Secret ID" (Кардардын сыры) көчүрүңүз
Ачык ишкана колдонмолору
"Объект 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-прокси аны ишке жарамдуу кылуу. Ушундан кийин Жүктөп алуу жана орнотуу аркылуу 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 кадимки Basic Auth аркылуу туташуу (жана кандайдыр бир сырсөз коюлган). Эгер сиз тутумду иштеткениңизде проксиди фондо кызмат катары баштоону кааласаңыз, мисалы, колдоно аласыз 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

Эгер шифрленген туташуу керек болсо, бул да мүмкүн - бул үчүн сиз адегенде жеке ачкычты жана өз алдынча кол коюлган сертификатты түзөсүз.:

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
Артка