16
16
17
17
from typing import Any , Dict
18
18
import jwt
19
- from jwt import PyJWKClient , ExpiredSignatureError , InvalidTokenError
19
+ from jwt import PyJWKClient , ExpiredSignatureError , InvalidTokenError , DecodeError
20
20
from jwt import InvalidAudienceError , InvalidIssuerError , InvalidSignatureError
21
21
from firebase_admin import _utils
22
22
@@ -38,6 +38,7 @@ def verify_token(token: str, app=None) -> Dict[str, Any]:
38
38
Raises:
39
39
ValueError: If the app's ``project_id`` is invalid or unspecified,
40
40
or if the token's headers or payload are invalid.
41
+ PyJWKClientError: If PyJWKClient fails to fetch a valid signing key.
41
42
"""
42
43
return _get_app_check_service (app ).verify_token (token )
43
44
@@ -71,9 +72,14 @@ def verify_token(self, token: str) -> Dict[str, Any]:
71
72
# Obtain the Firebase App Check Public Keys
72
73
# Note: It is not recommended to hard code these keys as they rotate,
73
74
# but you should cache them for up to 6 hours.
74
- signing_key = self ._jwks_client .get_signing_key_from_jwt (token )
75
- self ._has_valid_token_headers (jwt .get_unverified_header (token ))
76
- verified_claims = self ._decode_and_verify (token , signing_key .key )
75
+ try :
76
+ signing_key = self ._jwks_client .get_signing_key_from_jwt (token )
77
+ self ._has_valid_token_headers (jwt .get_unverified_header (token ))
78
+ verified_claims = self ._decode_and_verify (token , signing_key .key )
79
+ except (InvalidTokenError , DecodeError ) as exception :
80
+ raise ValueError (
81
+ f'Verifying App Check token failed. Error: { exception } '
82
+ )
77
83
78
84
verified_claims ['app_id' ] = verified_claims .get ('sub' )
79
85
return verified_claims
0 commit comments