|
19 | 19 | from jwt import PyJWK, InvalidAudienceError, InvalidIssuerError |
20 | 20 | from jwt import ExpiredSignatureError, InvalidSignatureError |
21 | 21 | import firebase_admin |
22 | | -from firebase_admin import app_check |
| 22 | +from firebase_admin import app_check, exceptions |
23 | 23 | from tests import testutils |
24 | 24 |
|
25 | 25 | NON_STRING_ARGS = [[], tuple(), {}, True, False, 1, 0] |
@@ -273,3 +273,51 @@ def test_verify_token_with_incorrect_issuer_raises_error(self, mocker): |
273 | 273 |
|
274 | 274 | expected = 'Token does not contain the correct "iss" (issuer).' |
275 | 275 | assert str(excinfo.value) == expected |
| 276 | + |
| 277 | + def test_verify_token_with_consume_true_not_consumed(self, mocker): |
| 278 | + mocker.patch("jwt.decode", return_value=JWT_PAYLOAD_SAMPLE) |
| 279 | + mocker.patch("jwt.PyJWKClient.get_signing_key_from_jwt", return_value=PyJWK(signing_key)) |
| 280 | + mocker.patch("jwt.get_unverified_header", return_value=JWT_PAYLOAD_SAMPLE.get("headers")) |
| 281 | + app = firebase_admin.get_app() |
| 282 | + app_check_service = app_check._get_app_check_service(app) |
| 283 | + mock_body = mocker.patch.object(app_check_service._http_client, "body", return_value={"alreadyConsumed": False}) |
| 284 | + |
| 285 | + payload = app_check.verify_token("encoded", app=app, consume=True) |
| 286 | + expected = JWT_PAYLOAD_SAMPLE.copy() |
| 287 | + expected["app_id"] = APP_ID |
| 288 | + expected["already_consumed"] = False |
| 289 | + assert payload == expected |
| 290 | + |
| 291 | + expected_url = f"https://firebaseappcheck.googleapis.com/v1/projects/{PROJECT_ID}:verifyAppCheckToken" |
| 292 | + mock_body.assert_called_once_with("post", expected_url, json={"app_check_token": "encoded"}) |
| 293 | + |
| 294 | + def test_verify_token_with_consume_true_already_consumed(self, mocker): |
| 295 | + mocker.patch("jwt.decode", return_value=JWT_PAYLOAD_SAMPLE) |
| 296 | + mocker.patch("jwt.PyJWKClient.get_signing_key_from_jwt", return_value=PyJWK(signing_key)) |
| 297 | + mocker.patch("jwt.get_unverified_header", return_value=JWT_PAYLOAD_SAMPLE.get("headers")) |
| 298 | + app = firebase_admin.get_app() |
| 299 | + app_check_service = app_check._get_app_check_service(app) |
| 300 | + mock_body = mocker.patch.object(app_check_service._http_client, "body", return_value={"alreadyConsumed": True}) |
| 301 | + |
| 302 | + payload = app_check.verify_token("encoded", app=app, consume=True) |
| 303 | + expected = JWT_PAYLOAD_SAMPLE.copy() |
| 304 | + expected["app_id"] = APP_ID |
| 305 | + expected["already_consumed"] = True |
| 306 | + assert payload == expected |
| 307 | + |
| 308 | + expected_url = f"https://firebaseappcheck.googleapis.com/v1/projects/{PROJECT_ID}:verifyAppCheckToken" |
| 309 | + mock_body.assert_called_once_with("post", expected_url, json={"app_check_token": "encoded"}) |
| 310 | + |
| 311 | + def test_verify_token_with_consume_true_backend_error(self, mocker): |
| 312 | + import requests |
| 313 | + mocker.patch("jwt.decode", return_value=JWT_PAYLOAD_SAMPLE) |
| 314 | + mocker.patch("jwt.PyJWKClient.get_signing_key_from_jwt", return_value=PyJWK(signing_key)) |
| 315 | + mocker.patch("jwt.get_unverified_header", return_value=JWT_PAYLOAD_SAMPLE.get("headers")) |
| 316 | + app = firebase_admin.get_app() |
| 317 | + app_check_service = app_check._get_app_check_service(app) |
| 318 | + |
| 319 | + req_exc = requests.exceptions.RequestException("Backend error") |
| 320 | + mocker.patch.object(app_check_service._http_client, "body", side_effect=req_exc) |
| 321 | + |
| 322 | + with pytest.raises(exceptions.FirebaseError): |
| 323 | + app_check.verify_token("encoded", app=app, consume=True) |
0 commit comments