Uzun zamandır duyurulan - şimdi gerçek : Microsoft, Eylül 2022'den itibaren Exchange Online'daki belirli protokoller için parola ile kimlik doğrulamasını oAuth2 lehine kapattı. Birçok kitaplığın ve yedekleme komut dosyasının GitHub sorunları, geçişin birçok yöneticiyi şaşırttığını açıkça ortaya koyuyor. Aşağıda, IMAP aracılığıyla PHP aracılığıyla oAuth2 yardımıyla Exchange posta kutunuzun içeriğine nasıl erişmeye devam edebileceğinizi gösteriyoruz.
Güvenlik açısından, Microsoft'un hareketi çok doğru, ancak e-postalarına programlı erişimin karmaşıklığı biraz arttı. Örneğin, yaygın olarak kullanılan barbushin/php-imap kitaplığını kullanıyorsanız, erişim eskiden şu şekildeydi:
734a82898010e2fcb02c72c3cd9702c2
Artık durum eskisi kadar basit değil. OAuth2 üzerinden bağlantı kurmak artık öncelikle erişim belirtecinin alınmasını gerektiriyor. Bu da iki engelin aşılmasını zorunlu kılıyor.
Azure Etkin Dizini
Aşağıdaki adımlar, Azure Active Directory'de yeni bir uygulamayı kaydeder:













Güç kalkanı
Şimdi uygulamayı çeviriyoruz Microsoft PowerShell (Yönetici modu) ve ayrı posta kutularına izinler atayın (<TENANTID>, <CLIENTID>, <OBJECTID>, <EMAIL> her durumda değiştirilmelidir):
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
...
Bu işlem tamamlandıktan sonra gerisi çok kolay. Barbushin/php-imap oAuth2'yi desteklemediği için, örneğin alternatif kütüphane Webklex/php-imap'i kullanarak bağlantı kurabilirsiniz (ki bu kütüphanenin PHP IMAP modülüne ihtiyaç duymaması da bir avantajdır).:
734a82898010e2fcb02c72c3cd9702c2
Ancak resmi olarak oAuth2'yi desteklemeyen kütüphaneler, aşağıdaki gibi bir proxy yardımıyla da kullanılabilir: simonrob/email-oauth2-proxy uygulanabilir hale getirin. Bundan sonra İndirmek ve üzerinden kurulum python -m pip install -r requirements-no-gui.txt (Python ≥3.6 gerekli) dosyayı düzenlersiniz emailproxy.config örneğin aşağıdaki gibi (bu zamanı değiştirerek <TENANTID>, <CLIENTID>, <CLIENTSECRET> ve <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>
Sonra proxy'yi başlatırsınız python emailproxy.py --no-gui ve artık şifrelenmemiş IP'ye gidebilir localhost limanda 1993 normal Temel Kimlik Doğrulama (ve herhangi bir parola seti) aracılığıyla bağlanın. Sistemi başlattığınızda proxy'yi arka planda bir hizmet olarak başlatmak istiyorsanız, örneğin kullanabilirsiniz. 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
Şifreli bir bağlantı gerekiyorsa, bu da mümkündür - bunun için önce bir özel anahtar ve kendinden imzalı bir sertifika oluşturursunuz:
openssl genrsa -out key.pem 3072
openssl req -new -x509 -key key.pem -out cert.pem -days 360
Daha sonra referans yapılır emailproxy.config bu iki dosya:
local_key_path = /path/to/key.pem
local_certificate_path = /path/to/cert.pem
E-posta gönderme
Microsoft Exchange Online üzerinden programatik olarak e-posta göndermek isteyen herkes de temel bir değişiklikle karşı karşıya: Microsoft, Exchange Online'da SMTP için klasik kullanıcı adı ve parola kimlik doğrulamasını devre dışı bıraktı. Yıllarca sadece birkaç satır kodla yapılan işlem artık OAuth2 üzerinden dolaylı bir yol gerektiriyor; bu da Azure Active Directory'de uygulama kaydı, sertifikalar ve belirteç yönetimini içeriyor. E-posta almanın yanı sıra e-posta gönderme için de aynı yaklaşımı uygulayabiliriz.




Microsoft Exchange 365 aracılığıyla SMTP gönderimi, IMAP erişimiyle aynı prensibi izler: Burada da Temel Kimlik Doğrulama kapatıldığı için oAuth2'yi aşmanın bir yolu yoktur. Azure uygulama kaydına "SMTP.SendAsApp" iznini ekledikten ve yönetici onayı verdikten sonra gönderme yapılabilir; örneğin PHPPostacı Bu özellik hayata geçirildi. Eskiden olduğu gibi sadece kullanıcı adı ve şifre girmek yerine, SMTP sunucusuna karşı kimlik doğrulama artık bir erişim belirteci kullanılarak yapılıyor. smtp.office365.com:
734a82898010e2fcb02c72c3cd9702c2
Ek kurulum çabası başlangıçta göz korkutucu görünebilir, ancak uzun vadede karşılığını verir: OAuth2 tabanlı kimlik doğrulama, yapılandırma dosyalarında veya komut dosyalarında düz metin parolaların saklanmasına gerek kalmadığı için önemli ölçüde daha güvenlidir ve erişim belirteci de zaman sınırlı olabilir ve izinleri ayrıntılı bir hassasiyetle kontrol edilebilir. Ayrıca burada e-posta alma ve gönderme için kullanışlı bir API sunan mailhelper kütüphanesinden de bahsetmekte fayda var.