【Azure Developer】Azure AD 註冊應用的 OAuth 2.0 v2 終結點獲取的 Token 解析出來依舊為v1, 這是什麼情況!

路邊兩盞燈發表於2023-05-04

問題描述

使用 Azure AD 註冊應用 Oauth2 v2.0的終結點(OAuth 2.0 token endpoint (v2): https://login.partner.microsoftonline.cn/<your tenant id>/oauth2/v2.0/token ) 獲取Token,解析出來依舊為v1.0,如何解決呢?

請求Method:

POST

請求URL

https://login.partner.microsoftonline.cn/<your tenant id>/oauth2/v2.0/token

請求的Body

tenant:<your tenant id>
client_id:AAD註冊應用的Application ID
scope:api://<AAD註冊應用的 Expose an API -- Application ID URI>/.default
grant_type:client_credentials
client_secret:<密碼>

執行後的結果為:
{
    "token_type": "Bearer",
    "expires_in": 3599,
    "ext_expires_in": 3599,
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIs... ...4ei78w"
}

 Postman執行截圖:

【Azure Developer】Azure AD 註冊應用的 OAuth 2.0 v2 終結點獲取的 Token 解析出來依舊為v1, 這是什麼情況!

但是,對生成的Access_Token內容進行解碼(Decode)時,結果發現version 為 1.0 :

JWT 解析地址:https://jwt.ms/

【Azure Developer】Azure AD 註冊應用的 OAuth 2.0 v2 終結點獲取的 Token 解析出來依舊為v1, 這是什麼情況!

 

問題解答

經過對Azure AD的應用註冊的瞭解,它的程式清單中,存在一個屬性值來控制生成的令牌版本(Token Version)。這個屬性值就是 accessTokenAcceptedVersion 

它的解釋是:https://docs.azure.cn/zh-cn/active-directory/develop/reference-app-manifest#accesstokenacceptedversion-attribute

指定資源的訪問令牌版本。 此引數會更改 JWT 的版本和格式。

accesstokenAcceptedVersion 的可能值為 1、2 或為 null。 如果值為 null,則此引數預設為 1,這對應於 v1.0 終結點。

使用的端點 v1.0 或 v2.0 由客戶端選擇,僅影響 id_tokens 的版本。 資源需要顯式配置 accesstokenAcceptedVersion 以指示受支援的訪問令牌格式。

根據以上說明,返回到Azure AD的註冊應用頁面,檢視程式清單,檢查 accessTokenAcceptedVersion 的值

【Azure Developer】Azure AD 註冊應用的 OAuth 2.0 v2 終結點獲取的 Token 解析出來依舊為v1, 這是什麼情況!

基於以上發現,確定解決方案為:修改 accessTokenAcceptedVersion 的值為 2 .

 

操作演示動畫

第一部分:修改 accessTokenAcceptedVersion 

【Azure Developer】Azure AD 註冊應用的 OAuth 2.0 v2 終結點獲取的 Token 解析出來依舊為v1, 這是什麼情況!

 

第二部分:驗證 Access Token

【Azure Developer】Azure AD 註冊應用的 OAuth 2.0 v2 終結點獲取的 Token 解析出來依舊為v1, 這是什麼情況!

 

參考資料

Azure Active Directory 應用清單:https://docs.azure.cn/zh-cn/active-directory/develop/reference-app-manifest#accesstokenacceptedversion-attribute

【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授權和 Azure AD 保護 Web API 後端,在請求中攜帶Token訪問後報401的錯誤 : https://www.cnblogs.com/lulight/p/14378218.html

【Azure 應用服務】NodeJS Express + MSAL 實現API應用Token認證(AAD OAuth2 idToken)的認證實驗 -- passport.authenticate() : https://www.cnblogs.com/lulight/p/16365869.html

 

相關文章