如何為多個(gè)Web API提供授權(quán)方法
譯文【51CTO.com快譯】Azure活動(dòng)目錄(Active Directory,Azure AD)是一種業(yè)界比較流行的企業(yè)級(jí)身份認(rèn)證服務(wù)。如今,許多組織都在使用該服務(wù),來(lái)啟用應(yīng)用程序的單點(diǎn)登錄(SSO),并保護(hù)其提供的Web API。其中,基于OpenId Connect(OIDC)身份驗(yàn)證的Microsoft Identity Platform 2.0是針對(duì)OAuth 2.0授權(quán)流程的最新改進(jìn)版本。
如果您的應(yīng)用程序使用到了Azure AD的如下功能,那么本文正好向您介紹如何為多個(gè)Web API提供授權(quán)的方法:
1. 啟用單點(diǎn)登錄(OpenId Connect身份驗(yàn)證)。
2. 使用OAuth 2授權(quán)(隱式授權(quán)流程)保護(hù)Web API。
3. 單個(gè)客戶端應(yīng)用程序使用到了多個(gè)Web API提供程序。
首先,我們假設(shè)您的客戶端應(yīng)用程序?qū)儆趩雾?yè)面式架構(gòu)(Single Page Architecture,如:Angular SPA),而且該架構(gòu)使用到了如下兩個(gè)不同的API:
1. Microsoft Graph API(https://dzone.com/articles/getting-access-token-for-microsoft-graph-using-oau?preview=true) - 獲取員工個(gè)人資料的詳細(xì)信息,并將其顯示在應(yīng)用程序的GUI中。該過(guò)程需要獲取一個(gè)訪問(wèn)令牌,并通過(guò)Graph API的調(diào)用進(jìn)行提交。
2. 自定義的Web API – 服務(wù)于應(yīng)用程序的基本功能和數(shù)據(jù)。對(duì)于每個(gè)Web API的調(diào)用,都必須獲得并提交不同的且單獨(dú)的訪問(wèn)令牌。
顯然,應(yīng)用程序的用戶必須事先使用Azure AD來(lái)進(jìn)行身份驗(yàn)證(OIDC,https://dzone.com/articles/integrating-okta-oauth-20-oidc-with-mulesoft-anypo),然后才能訪問(wèn)受API保護(hù)的各項(xiàng)功能與數(shù)據(jù)。也就是說(shuō),它們需要傳遞有效的JWT訪問(wèn)令牌,之后才能訪問(wèn)到受保護(hù)的API。
在Azure Portal中執(zhí)行SPA應(yīng)用程序的注冊(cè)
第一步,在Azure portal(https://portal.azure.com/#home)中注冊(cè)您的客戶端應(yīng)用程序(SPA)。注意:請(qǐng)為您的SPA應(yīng)用設(shè)置重定向的URI,并為隱式授權(quán)的OAuth 2數(shù)據(jù)流,選擇ID令牌和Access令牌。下圖是某個(gè)假定Web應(yīng)用程序的屏幕截圖,可供您參考:
指定URI路由
在Azure Portal中公布Web API
為Web API定義如下的配置。
1. 為Web API自定義范圍,以控制其訪問(wèn)受API保護(hù)的功能。
2. 授權(quán)可以調(diào)用Web API的客戶端應(yīng)用程序,以實(shí)現(xiàn)在調(diào)用期間無(wú)需人工判斷是否同意。
公布API
在Azure Portal中為客戶端應(yīng)用程序指定API的權(quán)限
為客戶端應(yīng)用程序選擇調(diào)用API的所有權(quán)限。如果需要獲取用戶的配置文件,請(qǐng)選擇帶有User.Read的Microsoft Graph API。如下圖截屏所示:
請(qǐng)求Microsoft Graph API權(quán)限
用同樣的方法,選擇Web API、以及自定義API的權(quán)限范圍。
請(qǐng)求Web API權(quán)限
從Angular SPA中調(diào)用Microsoft Graph API
我們所假設(shè)的Angular SPA(https://dzone.com/articles/angular-tutorials-and-articles)會(huì)通過(guò)調(diào)用Graph API,來(lái)獲取用戶個(gè)人資料的詳細(xì)信息。當(dāng)然,您也可以在Angular應(yīng)用中使用任何一種身份驗(yàn)證的客戶端庫(kù),例如:
- angular-auth-oidc-client
- oidc-client
此處值得特別注意的是:Microsoft Graph API和自定義的Web API是兩個(gè)截然不同的API提供類型,因此它們的作用域是無(wú)法被組合到同一個(gè)Angular應(yīng)用內(nèi)的同一個(gè)Azure AD進(jìn)行授權(quán)調(diào)用的。那么,正確的方法應(yīng)該是:使用兩個(gè)單獨(dú)的調(diào)用。即:分別對(duì)Microsoft Graph API和Web API各調(diào)用一次,并為每個(gè)調(diào)用指定不同的范圍。
下面是調(diào)用Microsoft Graph API的具體順序與步驟:
- 針對(duì)從Angular到Azure AD OAuth 2.0授權(quán)端點(diǎn)的首次調(diào)用,指定User.Read的范圍。
指定User.Read的范圍
2. Azure AD執(zhí)行用戶的身份驗(yàn)證。
3. Azure AD生成訪問(wèn)令牌,該訪問(wèn)令牌能夠基于用戶配置文件的詳細(xì)信息,來(lái)調(diào)用Graph API的對(duì)應(yīng)權(quán)限。同時(shí),它還會(huì)生成一個(gè)ID令牌,以指示用戶進(jìn)行登錄。
4. 注意:在v2.0中,Azure AD通過(guò)內(nèi)部調(diào)用userinfo Graph API,所獲取和返回的用戶詳細(xì)信息,僅為基本的用戶屬性。后續(xù),我們可以顯式地調(diào)用另一個(gè)Graph API端點(diǎn),以獲取用戶的詳細(xì)屬性信息。
5. 在Azure AD的重定向請(qǐng)求中,我們將基于Angular代碼,獲取對(duì)應(yīng)的訪問(wèn)令牌。通過(guò)調(diào)用Graph API,我們將此令牌的授權(quán)標(biāo)頭(Authorization header)設(shè)置為Bearer類型的令牌。據(jù)此,API將返回用戶個(gè)人資料的詳細(xì)信息,包括:?jiǎn)T工編號(hào)、照片和組織架構(gòu)等。
如下示例是一個(gè)對(duì)于Graph API端點(diǎn)的HTTP GET請(qǐng)求,它能夠獲取用戶的員工編號(hào)。注意:Bearer類型的令牌應(yīng)當(dāng)在請(qǐng)求的授權(quán)標(biāo)頭被傳遞過(guò)去。
https://graph.microsoft.com/v1.0/me$,userPrincipalName,country,extension_8b4e685f580748b59864d62c2e7fcfad_employeeNumber
從Angular SPA中調(diào)用自定義的Web API
具體順序與步驟如下:
1. 指定http://mystatementapi/access_as_user的范圍(雖然可以是任意范圍,但是我們最好去匹配那些Azure AD portal中的應(yīng)用程序,在其注冊(cè)過(guò)程中所定義好的范圍)。該范圍將被用于第二次調(diào)用Azure AD OAuth 2.0的授權(quán)端點(diǎn)。
指定user_as_access的范圍
2. 注意:由于在先前的調(diào)用中,我們的瀏覽器已經(jīng)設(shè)置好了身份驗(yàn)證的cookie,因此這一步將不再執(zhí)行用戶的身份驗(yàn)證。
3. Azure AD生成另一個(gè)具有訪問(wèn)權(quán)限的訪問(wèn)令牌,用以調(diào)用Web API。該令牌將被用于每一個(gè)Web API。
4. 在Azure AD重定向的請(qǐng)求中,我們將基于Angular代碼,獲取對(duì)應(yīng)的訪問(wèn)令牌。通過(guò)調(diào)用自定義的API,我們將此令牌的授權(quán)標(biāo)頭(Authorization header)設(shè)置為Bearer類型的令牌。
5. Web API驗(yàn)證來(lái)自Azure AD的令牌,如果驗(yàn)證成功,則返回正常的響應(yīng)信息;如果失敗,則告知有關(guān)錯(cuò)誤的信息。
刷新訪問(wèn)令牌
通常情況下,訪問(wèn)令牌的有效期是短暫的。我們可以將令牌的過(guò)期時(shí)間配置為一個(gè)小時(shí)或更短。那么在令牌到期之前,客戶端應(yīng)用程序應(yīng)當(dāng)從Azure AD處請(qǐng)求新的訪問(wèn)令牌。而且,該過(guò)程應(yīng)當(dāng)在沒(méi)有用戶干預(yù)的情況,由后臺(tái)自動(dòng)完成。因此,我們可以在客戶端應(yīng)用程序中采用隱藏的iframe方法。
實(shí)際上,這對(duì)于用于調(diào)用那些自定義Web API的訪問(wèn)令牌來(lái)說(shuō)(而不是本示例前面提到的Graph API)顯然是必需的。
總結(jié)
上文提到的Azure AD充當(dāng)了基于云端身份認(rèn)證服務(wù)的角色,您完全可以將自己的應(yīng)用部署到其他的云服務(wù)、或本地?cái)?shù)據(jù)中心中,以實(shí)現(xiàn)個(gè)性化的身份驗(yàn)證與授權(quán)。當(dāng)然,在開(kāi)始編寫(xiě)Angular應(yīng)用程序代碼之前,您也可以使用Postman客戶端(譯者注:一款強(qiáng)大的網(wǎng)頁(yè)調(diào)試和接口測(cè)試工具)來(lái)測(cè)試和驗(yàn)證Azure AD的配置、以及各種Web API。
總的說(shuō)來(lái),通過(guò)上述詳細(xì)的設(shè)計(jì)方法和實(shí)現(xiàn)步驟,我們演示了Angular客戶端應(yīng)用程序如何從不同的Web API處獲取OAuth 2類型授權(quán)的過(guò)程。希望對(duì)您有所幫助。
原文標(biāo)題:Authorization Approach for Multiple Web API Providers,作者:Satyen Mishra & Sachin Kulkarni
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】