簡體   English   中英

使用 keycloak 令牌中的“sub”聲明作為內部數據庫中的用戶 ID 是否安全

[英]Is it safe to use "sub" claim in keycloak token for user id in internal DB

我正在開發一個將來可能支持社交登錄的應用程序(除了我們自己的 keycloak 用戶名/電子郵件注冊)。

我正在嘗試確定使用 keycloak ID 令牌中的“sub”聲明作為我們內部 mongo db 中用戶的主鍵(“_id”字段)是否安全。 理想情況下,我希望使用令牌中的 id,因為在某些情況下,它可以讓我無需在我們的 api 中進行額外的用戶查找。

我看到 Microsoft azure 文檔顯示他們的身份驗證令牌同時具有“sub”和“oid”,其中“oid”建議用於內部用戶查找,因為它是全局唯一的。 請參閱本節

此 ID 在應用程序中唯一標識用戶 - 登錄同一用戶的兩個不同應用程序將在 oid 聲明中收到相同的值。 Microsoft Graph 將返回此 ID 作為給定用戶帳戶的 id 屬性。

那么 keycloak 中是否有等效的“oid”聲明,我是否需要添加自定義聲明以實現等效聲明,或者我是否可以只使用“sub”聲明?

查看JSON Web Token (JWT)文檔,即在“sub”(主題)聲明部分:

4.1.2. “子”(Subject)聲明

“sub”(主題)聲明標識了作為 JWT 主題的主體。 (...)。 主題值必須在發行者的上下文中限定為本地唯一或全局唯一 此聲明的處理通常是特定於應用程序的 (...)。 使用此聲明是可選的。

僅從我對本文的解釋來看,不能保證給定用戶的sub聲明在不同的應用程序(客戶端)中是相同的。 此外,該聲明是可選的。

因此,要准確回答您的問題,我們需要查看OpenID connect的上下文:

OpenID Connect 對 OAuth 2.0 進行的主要擴展以使最終用戶能夠被驗證是 ID 令牌數據結構。

必填 主題標識符。 最終用戶的發行者內的本地唯一且從未重新分配的標識符,旨在由客戶端使用(...)。

好吧,從這個文本以及要獲得ID Token你必須將openid范圍傳遞給請求的事實,你可以確定sub聲明將出現在ID Token中。

關於sub是否對所有客戶端都相同的問題,這也是同一文檔中主題標識符類型部分下的地址:

主題標識符類型

主題標識符是最終用戶在發行者中的本地唯一且從不重新分配的標識符,旨在由客戶端使用。

本規范定義了兩種主題標識符類型

public - 這為所有 Clients 提供相同的子(主題)值 如果提供者在其發現文檔中沒有 subject_types_supported 元素,則這是默認設置。

成對- 這為每個客戶端提供不同的子值,以免客戶端在未經許可的情況下關聯最終用戶的活動。

OpenID 提供者的發現文檔應該在 subject_types_supported 元素中列出其支持的主題標識符類型。 如果數組中列出了多個類型,客戶端可以選擇在注冊期間使用 subject_type 參數提供其首選標識符類型。

現在開始,keycloak 支持publicpairwise的主題標識符類型。 如果未明確指定,則默認使用public的。

所以得出結論:

還是我可以只使用“子”聲明代替?

是的,只要您考慮到正在使用的主題標識符類型。

主題值必須在發行者的上下文中限定為本地唯一或全局唯一。

所以“sub”(主題)Claim和“iss”(Issuer)Claim的組合總是全局唯一的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM