737 字
4 分鐘
#4 服務串接AAD OAuth — 簡單入門Azure AD
2023-03-31
無標籤

本文將說明如何幫自己的網站介接Azure AD的SSO登入功能,並取得使用者資料。另外也可以參考官方文件


SSO原理#

網站使用Azure AD登入有兩個方式為OAuth與SAML,本篇教學將說明使用OAuth方式,更多資料可以閱讀微軟文件

當我們使用OAuth驗證時,邏輯是這樣:

  1. 到網站點選Azure AD登入
  2. 跳轉到微軟登入畫面,使用者登入帳號密碼
  3. 驗證成功後,跳轉回原網站的callback網址,並帶一組token
  4. 網站後端用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,就可以取得登入資訊。