ចូលប្រើជាមួយ PHP ទៅ Exchange/Office 365

បានប្រកាសជាយូរមកហើយ - ឥឡូវនេះការពិត ៖ ក្រុមហ៊ុន Microsoft បានបិទការផ្ទៀងផ្ទាត់ភាពត្រឹមត្រូវដោយពាក្យសម្ងាត់សម្រាប់ពិធីការមួយចំនួននៅក្នុង Exchange Online ចាប់ពីខែកញ្ញា ឆ្នាំ 2022 ដើម្បីគាំទ្រ 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"
ជ្រើសរើស "ការចុះឈ្មោះកម្មវិធី" និង "ការចុះឈ្មោះថ្មី" ។
ចម្លង "លេខសម្គាល់កម្មវិធី (អតិថិជន)" (=លេខសម្គាល់អតិថិជន) និង "លេខសម្គាល់បញ្ជីឈ្មោះ (អ្នកជួល)" (=លេខសម្គាល់អ្នកជួល)។
"ការអនុញ្ញាត API" និង "បន្ថែមការអនុញ្ញាត"
"APIs ដែលប្រើដោយស្ថាប័នរបស់ខ្ញុំ" & "Office 365 Exchange Online"
"ការអនុញ្ញាតកម្មវិធី" និង "IMAP.AccessAsApp"
ផ្តល់ការយល់ព្រមពីអ្នកគ្រប់គ្រង
"វិញ្ញាបនបត្រ និងអាថ៌កំបាំង" និង "អាថ៌កំបាំងអតិថិជន" និង "អាថ៌កំបាំងអតិថិជនថ្មី"
ជ្រើសរើសការពិពណ៌នា និងកំណត់សុពលភាព
ចម្លង "លេខសម្គាល់សម្ងាត់" (សម្ងាត់អតិថិជន) ទៅក្ដារតម្បៀតខ្ទាស់
បើកកម្មវិធីសហគ្រាស
ចម្លង "លេខសម្គាល់វត្ថុ" ។

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 ភ្ជាប់តាមរយៈ Basic Auth ធម្មតា (និងការកំណត់ពាក្យសម្ងាត់ណាមួយ)។ ប្រសិនបើអ្នកចង់ចាប់ផ្តើមប្រូកស៊ីជាសេវាកម្មក្នុងផ្ទៃខាងក្រោយ នៅពេលអ្នកចាប់ផ្តើមប្រព័ន្ធ អ្នកអាចប្រើឧទាហរណ៍ ប្រព័ន្ធ:

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
ថយក្រោយ