[英]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_signature
為False
將被忽略。 檢查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.