2021-06-28 09:08:09 +00:00
|
|
|
from datetime import datetime, timedelta
|
|
|
|
|
2022-07-21 11:58:50 +00:00
|
|
|
from auth.jwtcodec import JWTCodec
|
2022-08-11 05:53:14 +00:00
|
|
|
from base.redis import redis
|
2021-06-28 09:08:09 +00:00
|
|
|
from settings import JWT_LIFE_SPAN
|
2021-06-29 10:26:46 +00:00
|
|
|
from auth.validations import User
|
2021-06-28 09:08:09 +00:00
|
|
|
|
2022-01-13 12:16:35 +00:00
|
|
|
class TokenStorage:
|
|
|
|
@staticmethod
|
|
|
|
async def save(token_key, life_span, auto_delete=True):
|
|
|
|
await redis.execute("SET", token_key, "True")
|
|
|
|
if auto_delete:
|
|
|
|
expire_at = (datetime.now() + timedelta(seconds=life_span)).timestamp()
|
|
|
|
await redis.execute("EXPIREAT", token_key, int(expire_at))
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
async def exist(token_key):
|
|
|
|
return await redis.execute("GET", token_key)
|
|
|
|
|
2021-06-28 09:08:09 +00:00
|
|
|
|
|
|
|
class Authorize:
|
2022-01-13 12:16:35 +00:00
|
|
|
@staticmethod
|
|
|
|
async def authorize(user: User, device: str = "pc", life_span = JWT_LIFE_SPAN, auto_delete=True) -> str:
|
|
|
|
exp = datetime.utcnow() + timedelta(seconds=life_span)
|
2022-07-21 11:58:50 +00:00
|
|
|
token = JWTCodec.encode(user, exp=exp, device=device)
|
2022-01-13 12:16:35 +00:00
|
|
|
await TokenStorage.save(f"{user.id}-{token}", life_span, auto_delete)
|
|
|
|
return token
|
2021-06-28 09:08:09 +00:00
|
|
|
|
2022-01-13 12:16:35 +00:00
|
|
|
@staticmethod
|
|
|
|
async def revoke(token: str) -> bool:
|
|
|
|
try:
|
2022-07-21 11:58:50 +00:00
|
|
|
payload = JWTCodec.decode(token)
|
2022-01-13 12:16:35 +00:00
|
|
|
except: # noqa
|
|
|
|
pass
|
|
|
|
else:
|
|
|
|
await redis.execute("DEL", f"{payload.user_id}-{token}")
|
|
|
|
return True
|
2021-06-28 09:08:09 +00:00
|
|
|
|
2022-01-13 12:16:35 +00:00
|
|
|
@staticmethod
|
|
|
|
async def revoke_all(user: User):
|
|
|
|
tokens = await redis.execute("KEYS", f"{user.id}-*")
|
|
|
|
await redis.execute("DEL", *tokens)
|