Skip to content

Instantly share code, notes, and snippets.

@Kyly
Created January 26, 2022 07:09
Show Gist options
  • Save Kyly/5f0f01ae8e9b015a5e3f1b716e01af04 to your computer and use it in GitHub Desktop.
Save Kyly/5f0f01ae8e9b015a5e3f1b716e01af04 to your computer and use it in GitHub Desktop.
Sample is authenticated decorator
import inspect
from datetime import datetime, time
from functools import wraps
class FakeUser:
def __init__(self, name, id):
self.id = id
self.name = name
def __str__(self):
return f"FakeUser(name={self.name}, id={self.id})"
def _get_user(user_id: int) -> FakeUser | None:
return FakeUser(name="Joe", id=user_id)
class NotAuthenticatedError:
pass
class TokenExpiredError:
pass
def is_authenticated(user_param_name="current_user"):
"""Execute function if request contains valid access token."""
def inner_decorator(f):
user_parameter = inspect.signature(f).parameters.get(user_param_name)
@wraps(f)
def wrapped(*args, **kwargs):
decoded_token = {"some": "fake token payload", "user_id": 1, "exp": 1264486466}
# If it's not a valid token raise NotAuthenticatedError
if datetime.fromtimestamp(decoded_token["exp"]).time() < time():
raise TokenExpiredError
user = _get_user(decoded_token["user_id"])
if user is None:
raise NotAuthenticatedError
if user_parameter is not None:
kwargs[user_param_name] = user
return f(*args, **kwargs)
return wrapped
return inner_decorator
@is_authenticated()
def guarded_func(derp0: int, current_user: FakeUser, derp2: int) -> None:
print(f"current_user: {current_user}, derp: {derp0}, derp2: {derp2}")
guarded_func(derp0=0, derp2=2)
@is_authenticated(user_param_name="custom_param_name")
def guarded_func2(custom_param_name: FakeUser) -> None:
print(f"custom_param_name: {custom_param_name}")
guarded_func2()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment