PHP से एक्सचेंज/ऑफिस 365 तक पहुंच

लंबे समय से घोषित - अब वास्तविकता : Microsoft ने oAuth2 के पक्ष में सितंबर 2022 से एक्सचेंज ऑनलाइन में कुछ प्रोटोकॉल के लिए पासवर्ड द्वारा प्रमाणीकरण को बंद कर दिया है। कई पुस्तकालयों और बैकअप स्क्रिप्ट के GitHub मुद्दे यह स्पष्ट करते हैं कि बदलाव ने कई प्रशासकों को आश्चर्यचकित कर दिया। नीचे हम एक तरीका दिखाते हैं कि कैसे आप IMAP के माध्यम से PHP के माध्यम से oAuth2 की सहायता से अपने एक्सचेंज मेलबॉक्स की सामग्री तक पहुंच जारी रख सकते हैं।


सुरक्षा की दृष्टि से माइक्रोसॉफ्ट का यह कदम बहुत सही है, लेकिन इसके ई-मेल तक प्रोग्रामेटिक एक्सेस की जटिलता काफी बढ़ गई है। उदाहरण के लिए, यदि आप व्यापक रूप से उपयोग की जाने वाली बारबुशिन/php-imap लाइब्रेरी का उपयोग करते हैं, तो एक्सेस इस प्रकार हुआ करती थी:

734a82898010e2fcb02c72c3cd9702c2

यह बस अब और काम नहीं करता। OAuth2 के माध्यम से एक कनेक्शन स्थापित करने के लिए, पहली कठिनाई पहुँच टोकन प्राप्त करना है। और इसके लिए आपको दो बाधाओं का सामना करना पड़ेगा।

Azure सक्रिय निर्देशिका

निम्नलिखित चरण Azure सक्रिय निर्देशिका में एक नया ऐप पंजीकृत करते हैं:

https://portal.azure.com में प्रवेश करें
"Azure सक्रिय निर्देशिका" खोलें
"ऐप पंजीकरण" और "नया पंजीकरण" चुनें।
"एप्लिकेशन आईडी (क्लाइंट)" (= क्लाइंट आईडी) और "डायरेक्टरी आईडी (टेनेंट)" (=टेनेंट आईडी) कॉपी करें।
"एपीआई अनुमतियां" और "अनुमति जोड़ें"
"मेरे संगठन द्वारा उपयोग किए जाने वाले एपीआई" और "ऑफिस 365 एक्सचेंज ऑनलाइन"
"एप्लिकेशन अनुमतियां" और "IMAP.AccessAsApp"
व्यवस्थापक सहमति प्रदान करें
"प्रमाण पत्र और रहस्य" और "ग्राहक रहस्य" और "नए ग्राहक रहस्य"
विवरण चुनें और वैधता निर्धारित करें
क्लिपबोर्ड पर "सीक्रेट आईडी" (क्लाइंट सीक्रेट) कॉपी करें
एंटरप्राइज़ एप्लिकेशन खोलें
"ऑब्जेक्ट आईडी" कॉपी करें।

पावरशेल

अब हम ऐप को में बदलते हैं माइक्रोसॉफ्ट पावरशेल (व्यवस्थापक मोड) और अलग-अलग मेलबॉक्सों को अनुमतियाँ असाइन करें (<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 का समर्थन नहीं करते हैं, उनका उपयोग प्रॉक्सी के साथ भी किया जा सकता है जैसे सिमोनरोब/ईमेल-oauth2-प्रॉक्सी इसे काम करने योग्य बनाएं। इसके बाद डाउनलोड और स्थापना के माध्यम से python -m pip install -r requirements-no-gui.txt (पायथन 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 रेगुलर बेसिक ऑथ (और कोई भी पासवर्ड सेट) के जरिए कनेक्ट करें। यदि आप सिस्टम शुरू करते समय पृष्ठभूमि में एक सेवा के रूप में प्रॉक्सी शुरू करना चाहते हैं, उदाहरण के लिए, आप इसका उपयोग कर सकते हैं 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
वापस