在APIM中自動使用Jwt Token統一進行驗證

圖片

Azure API Management (APIM) 是 Microsoft Azure 服務的一部分,主要功能在協助組織建立、發佈、維護、監控和保護 API。
圖片
其主要功能包含:

  • API Gateway
  • 限流和配額
  • 分析和監控
  • 保護 API
  • 現有服務的代理和包裝 …

使用 Azure APIM 可以幫助組織提供統一的 API Gateway、提升 API 管理與發佈、更確保 API 的安全和可靠性。因此,在最近幾年許多企業開始想走微服務或是API first的架構下,常常做為API的對外閘道。

這樣做有一個好處,拿保護API做為例子,透過APIM,你只需要透過設定,就可以讓Gateway 後面的所有API都支援 JWT token驗證,你就無需在每隻API的程式碼裡面,去做token驗證的動作。

這一篇,我們就來實踐這個例子。

使用 Policy

我們做好了一組測試API,呼叫的網址是 https://testapim20231030.azure-api.net/conference/speakers ,這是APIM的雲端位置,它保護了我們原始的API Endpoint,這也是閘道器基本的功能和行為。

你會發現,預設狀況下我們透過postman在呼叫這組API的時候,是無需驗證帳號密碼的:
圖片

假設,我們希望讓 APIs 都受到JWT token驗證的保護,那只需要在 InBound Policy 這邊做設定:
圖片

加入底下這條 policy:

<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized">
    <issuer-signing-keys>
        <key>123456781234567812345678</key>
    </issuer-signing-keys>
    <required-claims>
        <claim name="admin" match="any">
            <value>true</value>
        </claim>
    </required-claims>
</validate-jwt>

其中的 key 是 JWT token 的 金鑰,如此設定之後,未來沒有帶上 JWT token,將會無法呼叫(收到401錯誤):
圖片

直到我們給了適當的 JWT token:
圖片
才能夠正確呼叫。

這個JWT token,必須採用同樣的key生成,並且必須內含 admin=ture 的 Claim 資訊(對Claim不熟請參考筆者這一篇文章),因為我們在 XML 的 policy 中,指定要驗證 jwt token 中的 admin 資訊:

    <required-claims>
        <claim name="admin" match="any">
            <value>true</value>
        </claim>
    </required-claims>

所以,當呼叫該API時,必須帶上jwt token,且其中必須包含 admin為true的設定,這樣才能夠通過。

底下是生成該 jwt token 的基本參數:
圖片

如此一來,我們在production階段,可以輕易地統一針對被包裹的API置換或設定JWT token 的驗證條件與規則,而開發階段則完全不需要去管這些瑣事。這樣不僅僅方便開發測試,也便於在production階段,針對不同單位(團隊)所開發出的API做統一的權限與驗證管理,對微服務的搭建有著莫大的好處。

留言

這個網誌中的熱門文章

在POC或迷你專案中使用 LiteDB

使用Qdrant向量資料庫實作語意相似度比對

專業的價值...

使用 Airtable 在小型需求上取代傳統資料庫

讓 LINE Bot 對談機器人顯示 "Loading..." 動畫