Akses dengan PHP ke Exchange/Office 365

Sudah lama diumumkan - sekarang kenyataan : Microsoft telah menonaktifkan otentikasi dengan kata sandi untuk protokol tertentu di Exchange Online mulai September 2022 demi oAuth2. Masalah GitHub dari banyak perpustakaan dan skrip cadangan memperjelas bahwa pergantian itu mengejutkan banyak administrator. Di bawah ini kami menunjukkan cara bagaimana Anda dapat terus mengakses konten kotak surat Exchange Anda dengan bantuan oAuth2 melalui PHP melalui IMAP.


Dari sudut pandang keamanan, langkah Microsoft sangat tepat, tetapi kompleksitas akses terprogram ke emailnya telah meningkat sedikit. Misalnya, jika Anda menggunakan perpustakaan barbushin/php-imap yang banyak digunakan, aksesnya adalah sebagai berikut::

734a82898010e2fcb02c72c3cd9702c2

Itu tidak berfungsi lagi. Untuk membuat koneksi melalui oAuth2, kesulitan pertama adalah mendapatkan token akses. Dan untuk ini, Anda harus menghadapi dua rintangan.

Direktori Aktif Azure

Langkah-langkah berikut mendaftarkan aplikasi baru di Azure Active Directory:

Masuk ke https://portal.azure.com
Buka "Direktori Aktif Azure"
Pilih "Pendaftaran aplikasi" & "Pendaftaran baru".
Salin "ID Aplikasi (Klien)" (=ID Klien) & "ID Direktori (Penyewa)" (=ID Penyewa).
"Izin API" & "Tambah Izin"
"API yang digunakan oleh organisasi saya" & "Office 365 Exchange Online"
"Izin Aplikasi" & "IMAP.AccessAsApp"
Berikan persetujuan admin
"Sertifikat & Rahasia" & "Rahasia Klien" & "Rahasia Klien Baru"
Pilih deskripsi dan atur validitas
Salin "ID Rahasia" (Rahasia Klien) ke papan klip
Buka aplikasi perusahaan
Salin "ID Objek".

PowerShell

Sekarang kita mengubah aplikasi di Microsoft PowerShell (Mode Administrator) dan berikan izin ke kotak surat individual (<TENANTID>, <CLIENTID>, <OBJECTID>, <EMAIL> harus diganti dalam setiap kasus):

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

Setelah Anda selesai melakukannya, sisanya bukanlah ilmu roket. Karena barbushin/php-imap tidak mendukung oAuth2, Anda dapat terhubung dengan pustaka alternatif Webklex/php-imap (yang juga memiliki keuntungan karena tidak memerlukan modul PHP IMAP ).:

734a82898010e2fcb02c72c3cd9702c2

Namun, perpustakaan yang tidak secara resmi mendukung oAuth2 juga dapat digunakan dengan proxy seperti simonrob/email-oauth2-proxy membuatnya bisa diterapkan. Sesudah ini Unduh dan instalasi melalui python -m pip install -r requirements-no-gui.txt (Python 3.6 diperlukan) Anda mengedit file emailproxy.config misalnya sebagai berikut (mengganti waktu ini <TENANTID>, <CLIENTID>, <CLIENTSECRET> dan <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>

Kemudian Anda memulai proxy dengan python emailproxy.py --no-gui dan sekarang bisa masuk ke IP yang tidak terenkripsi localhost di pelabuhan 1993 terhubung melalui Auth Dasar biasa (dan set kata sandi apa pun). Jika Anda ingin memulai proxy sebagai layanan di latar belakang saat Anda memulai sistem, Anda dapat menggunakan, misalnya sistemd:

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

Jika koneksi terenkripsi diperlukan, ini juga memungkinkan - untuk ini Anda terlebih dahulu membuat kunci pribadi dan sertifikat yang ditandatangani sendiri:

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

Kemudian referensi dibuat di emailproxy.config dua file ini:

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