本文將說明如何幫自己的網站介接Azure AD的SSO登入功能,並取得使用者資料。另外也可以參考官方文件。
SSO原理
網站使用Azure AD登入有兩個方式為OAuth與SAML,本篇教學將說明使用OAuth方式,更多資料可以閱讀微軟文件。
當我們使用OAuth驗證時,邏輯是這樣:
- 到網站點選Azure AD登入
- 跳轉到微軟登入畫面,使用者登入帳號密碼
- 驗證成功後,跳轉回原網站的callback網址,並帶一組token
- 網站後端用token取得使用者資料
我們這次範例,後端使用Cloudflare Worker,展示如何登入並取得使用者資料,範例的網址為https://aadsso.hchou.workers.dev,callback網址為https://aadsso.hchou.workers.dev/callback
申請AAD Secret
我們需要申請AAD的Secret才能介接SSO,首先到Azure後台>Azure Active Directory>應用程式註冊>新增註冊,我們範例僅限組織成員登入就勾第一個,下面重新導向URI選擇Web,填入規劃的callback路徑。

建立好後,會到這個畫面,這裡要記一下應用程式識別碼、目錄識別碼之後會用到。

接下來點選”憑證及秘密”,新增用戶端密碼,產生一組Secret,把產生的值記下來。

再來到API權限,點選代表授予管理員同意

撰寫後端
以Cloudflare Worker為例,這裡有兩頁網站,首頁有個AAD登入按鈕,另外有一個callback網址。
首頁長這樣

登入會,會顯示取得使用者的資訊的JSON

範例程式碼如下
const tenant_id = '<目錄識別碼>';const client_id = '<應用程式識別碼>';const client_secret = '<用戶端密碼>';const callback_url = '<callback完整網址>';
export default { async fetch(request, env) { const url = new URL(request.url); const { pathname, search } = url; if (pathname == "/") { return await home(request); } else if (pathname == "/callback") { return await callback(request); } }}
async function home(request) { const login = `https://login.microsoftonline.com/${tenant_id}/oauth2/v2.0/authorize?response_type=code&client_id=${client_id}&redirect_uri=${callback_url}&scope=user.read`; const html = `<!DOCTYPE html> <body> <h1>Test SSO</h1> <a href="${login}">Azure AD Login</a> </body>`; return new Response(html, { headers: { 'content-type': 'text/html;charset=UTF-8', } });}
async function callback(request) { var url = `https://login.microsoftonline.com/${tenant_id}/oauth2/v2.0/token`; const { searchParams } = new URL(request.url); let code = searchParams.get('code'); var options = { method: 'POST', headers: { 'content-type': 'application/x-www-form-urlencoded', }, body: new URLSearchParams({ client_id: client_id, client_secret: client_secret, code: code, redirect_uri: callback_url, grant_type: 'authorization_code' }).toString() }; var response = await fetch(url, options); var results = await response.json();
var token = results["access_token"]; url = `https://graph.microsoft.com/v1.0/me`; options = { method: 'GET', headers: { 'Authorization': 'Bearer ' + token, 'content-type': 'application/json' }, }; response = await fetch(url, options); results = await response.text();
return new Response(results);}接著講解一下各頁面,首頁比較簡單,只需要一個靜態的HTML,並超連結到微軟登入畫面。
Callback則比較複雜,微軟會回傳一個較Code的參數,需要以該參數取得Access Token,用token可以取得使用者資料,使用者資料欄位請參考微軟文件。
結語
串接Azure AD SSO其實滿容易的,只需要開好應用程式與Secret,設好callback,就可以取得登入資訊。