簡體   English   中英

PyJWT 驗證自定義聲明

[英]PyJWT validate custom claims

使用 authlib 有一段時間了,驗證聲明的存在及其價值真的很容易。 根據示例:

claims_options = {
    "iss": { "essential": True, "value": "https://idp.example.com" },
    "aud": { "essential": True, "value": "api1" },
    "email": { "essential": True, "value": "user1@email.com" },
 }

claims = jwt.decode(token, jwk, claims_options=claims_options)
claims.validate()

但是,對於 PyJWT,我發現它有點不清楚。 我似乎只能檢查索賠是否存在,但不能檢查其價值(aud 和 iss 顯然有效):

decoded_token = jwt.decode(
    token,
    key,
    audience="api1",
    issuer="issuer"
    algorithms=["RS256"],
    options={"require": ["exp", "iss", "aud", "email"]}
)

文檔中甚至提到了這一點。 但是,文檔似乎不完整。 簡而言之,是否可以驗證自定義聲明值,或者我是否只需要手動解析解碼的令牌並查找我想要的值?

在 PyJWT 中,您可以驗證發布者和受眾,不僅是聲明的存在,還有價值。 對於自定義索賠,情況與我的回答末尾提到的不同。

audience 和 issuer 的驗證值是decode function 中選項之后的可選參數。

文檔在選項參數下提到了這一點

verify_aud=True但如果verify_signatureFalse將被忽略。 檢查aud (觀眾)聲明是否與audience匹配

所以結論是,您需要手動解析自定義聲明。

import jwt
token = jwt.encode({"iss":"me", "aud":"you"}, "secret", "HS256")
print(token)
decoded_token = jwt.decode(token, "secret", ["HS256"], 
                           {"verify_aud":"true", "verify_iss":"true"}, 
                           audience="you", issuer="me")
print(decoded_token)

如果您創建如上所示的令牌,則 output 將是:

{'iss': '我', 'aud': '你'}

如果將令牌中的“aud”聲明更改為不同的值,則會出現異常:

jwt.exceptions.InvalidAudienceError:受眾無效

關於自定義聲明,在我寫了關於觀眾和發行人聲明之后添加到問題中的部分,文檔恕我直言非常清楚:

require=[]必須存在的聲明列表。 例如require=["exp", "iat", "nbf"] 僅驗證聲明是否存在。 不驗證聲明是否有效。

而且也沒有地方可以添加值。 即使對於受眾和發行者,這些值也是作為可選參數提供的,而不是選項字典的一部分。

所以結論是,在成功解碼令牌后,您需要手動驗證自定義聲明。

暫無
暫無

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

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