Skip to content

Commit b73670f

Browse files
committed
refactor: remove verify_token and complete spit implementation
1 parent fd3026a commit b73670f

File tree

3 files changed

+26
-61
lines changed

3 files changed

+26
-61
lines changed

src/firebase_functions/https_fn.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -354,8 +354,7 @@ class CallableRequest(_typing.Generic[_core.T]):
354354

355355
def _on_call_handler(func: _C2,
356356
request: Request,
357-
enforce_app_check: bool,
358-
verify_token: bool = True) -> Response:
357+
enforce_app_check: bool) -> Response:
359358
try:
360359
if not _util.valid_on_call_request(request):
361360
_logging.error("Invalid request, unable to process.")
@@ -365,8 +364,7 @@ def _on_call_handler(func: _C2,
365364
data=_json.loads(request.data)["data"],
366365
)
367366

368-
token_status = _util.on_call_check_tokens(request,
369-
verify_token=verify_token)
367+
token_status = _util.on_call_check_tokens(request)
370368

371369
if token_status.auth == _util.OnCallTokenState.INVALID:
372370
raise HttpsError(FunctionsErrorCode.UNAUTHENTICATED,
@@ -420,7 +418,7 @@ def _on_call_handler(func: _C2,
420418
def on_request(**kwargs) -> _typing.Callable[[_C1], _C1]:
421419
"""
422420
Handler which handles HTTPS requests.
423-
Requires a function that takes a ``Request`` and ``Response`` object,
421+
Requires a function that takes a ``Request`` and ``Response`` object,
424422
the same signature as a Flask app.
425423
426424
Example:

src/firebase_functions/private/util.py

+12-20
Original file line numberDiff line numberDiff line change
@@ -211,12 +211,9 @@ def as_dict(self) -> dict:
211211
}
212212

213213

214-
def _on_call_check_auth_token(
215-
request: _Request,
216-
verify_token: bool = True,
217-
) -> None | _typing.Literal[OnCallTokenState.INVALID] | dict[str, _typing.Any]:
214+
def _on_call_check_auth_token(request: _Request) -> None | _typing.Literal[OnCallTokenState.INVALID] | dict[str, _typing.Any]:
218215
"""
219-
Validates the auth token in a callable request.
216+
Validates the auth token in a callable request.
220217
If verify_token is False, the token will be decoded without verification.
221218
"""
222219
authorization = request.headers.get("Authorization")
@@ -227,10 +224,7 @@ def _on_call_check_auth_token(
227224
return OnCallTokenState.INVALID
228225
try:
229226
id_token = authorization.replace("Bearer ", "")
230-
if verify_token:
231-
auth_token = _auth.verify_id_token(id_token)
232-
else:
233-
auth_token = _unsafe_decode_id_token(id_token)
227+
auth_token = _auth.verify_id_token(id_token)
234228
return auth_token
235229
# pylint: disable=broad-except
236230
except Exception as err:
@@ -273,25 +267,23 @@ def _unsafe_decode_id_token(token: str):
273267
return payload
274268

275269

276-
def on_call_check_tokens(request: _Request,
277-
verify_token: bool = True) -> _OnCallTokenVerification:
270+
def on_call_check_tokens(request: _Request) -> _OnCallTokenVerification:
278271
"""Check tokens"""
279272
verifications = _OnCallTokenVerification()
280273

281-
auth_token = _on_call_check_auth_token(request, verify_token=verify_token)
274+
auth_token = _on_call_check_auth_token(request)
282275
if auth_token is None:
283276
verifications.auth = OnCallTokenState.MISSING
284277
elif isinstance(auth_token, dict):
285278
verifications.auth = OnCallTokenState.VALID
286279
verifications.auth_token = auth_token
287280

288-
if verify_token:
289-
app_token = _on_call_check_app_token(request)
290-
if app_token is None:
291-
verifications.app = OnCallTokenState.MISSING
292-
elif isinstance(app_token, dict):
293-
verifications.app = OnCallTokenState.VALID
294-
verifications.app_token = app_token
281+
app_token = _on_call_check_app_token(request)
282+
if app_token is None:
283+
verifications.app = OnCallTokenState.MISSING
284+
elif isinstance(app_token, dict):
285+
verifications.app = OnCallTokenState.VALID
286+
verifications.app_token = app_token
295287

296288
log_payload = {
297289
**verifications.as_dict(),
@@ -301,7 +293,7 @@ def on_call_check_tokens(request: _Request,
301293
}
302294

303295
errs = []
304-
if verify_token and verifications.app == OnCallTokenState.INVALID:
296+
if verifications.app == OnCallTokenState.INVALID:
305297
errs.append(("AppCheck token was rejected.", log_payload))
306298

307299
if verifications.auth == OnCallTokenState.INVALID:

src/firebase_functions/tasks_fn.py

+11-36
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,24 @@
1616
# pylint: disable=protected-access
1717
import typing as _typing
1818
import functools as _functools
19+
import dataclasses as _dataclasses
20+
import json as _json
1921

20-
from flask import Request, Response
22+
from flask import Request, Response, make_response as _make_response, jsonify as _jsonify
2123

24+
import firebase_functions.core as _core
2225
import firebase_functions.options as _options
2326
import firebase_functions.private.util as _util
24-
from firebase_functions.https_fn import CallableRequest, _on_call_handler
27+
from firebase_functions.https_fn import CallableRequest, HttpsError, FunctionsErrorCode
28+
29+
from functions_framework import logging as _logging
2530

2631
_C = _typing.Callable[[CallableRequest[_typing.Any]], _typing.Any]
32+
_C1 = _typing.Callable[[Request], Response]
33+
_C2 = _typing.Callable[[CallableRequest[_typing.Any]], _typing.Any]
2734

2835
def _on_call_handler(func: _C2,
29-
request: Request,
30-
enforce_app_check: bool,
31-
verify_token: bool = True) -> Response:
36+
request: Request) -> Response:
3237
try:
3338
if not _util.valid_on_call_request(request):
3439
_logging.error("Invalid request, unable to process.")
@@ -38,33 +43,6 @@ def _on_call_handler(func: _C2,
3843
data=_json.loads(request.data)["data"],
3944
)
4045

41-
token_status = _util.on_call_check_tokens(request,
42-
verify_token=verify_token)
43-
44-
if token_status.auth == _util.OnCallTokenState.INVALID:
45-
raise HttpsError(FunctionsErrorCode.UNAUTHENTICATED,
46-
"Unauthenticated")
47-
48-
if enforce_app_check and token_status.app in (
49-
_util.OnCallTokenState.MISSING, _util.OnCallTokenState.INVALID):
50-
raise HttpsError(FunctionsErrorCode.UNAUTHENTICATED,
51-
"Unauthenticated")
52-
if token_status.app == _util.OnCallTokenState.VALID and token_status.app_token is not None:
53-
context = _dataclasses.replace(
54-
context,
55-
app=AppCheckData(token_status.app_token["sub"],
56-
token_status.app_token),
57-
)
58-
59-
if token_status.auth_token is not None:
60-
context = _dataclasses.replace(
61-
context,
62-
auth=AuthData(
63-
token_status.auth_token["uid"]
64-
if "uid" in token_status.auth_token else None,
65-
token_status.auth_token),
66-
)
67-
6846
instance_id = request.headers.get("Firebase-Instance-ID-Token")
6947
if instance_id is not None:
7048
# Validating the token requires an http request, so we don't do it.
@@ -116,10 +94,7 @@ def on_task_dispatched_decorator(func: _C):
11694

11795
@_functools.wraps(func)
11896
def on_task_dispatched_wrapped(request: Request) -> Response:
119-
return _on_call_handler(func,
120-
request,
121-
enforce_app_check=False,
122-
verify_token=False)
97+
return _on_call_handler(func, request)
12398

12499
_util.set_func_endpoint_attr(
125100
on_task_dispatched_wrapped,

0 commit comments

Comments
 (0)