robot_account_service.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import logging
  2. from datetime import UTC, datetime, timedelta
  3. from typing import Optional
  4. from configs import dify_config
  5. from extensions.ext_redis import redis_client
  6. from libs.passport import PassportService
  7. from models import Account
  8. from services.account_service import AccountService
  9. ACCESS_TOKEN_PREFIX = "access_token:"
  10. ACCESS_TOKEN_EXPIRY = timedelta(minutes=dify_config.ACCESS_TOKEN_EXPIRE_MINUTES)
  11. class RobotAccountService:
  12. @staticmethod
  13. def login(email: str, password: str, *, ip_address: Optional[str] = None) -> str:
  14. account = AccountService.authenticate(email, password)
  15. token_pair = AccountService.login(account=account, ip_address=ip_address)
  16. access_token = token_pair.access_token
  17. access_token_key = RobotAccountService._get_access_token_key(email)
  18. redis_client.setex(access_token_key, ACCESS_TOKEN_EXPIRY, access_token)
  19. return access_token
  20. @staticmethod
  21. def get_account_jwt_token(account: Account) -> str:
  22. exp_dt = datetime.now(UTC) + ACCESS_TOKEN_EXPIRY
  23. exp = int(exp_dt.timestamp())
  24. payload = {
  25. "user_id": account.id,
  26. "exp": exp,
  27. "iss": dify_config.EDITION,
  28. "sub": "Console API Passport",
  29. }
  30. token: str = PassportService().issue(payload)
  31. return token
  32. @staticmethod
  33. def get_account_access_token(email) -> str:
  34. access_token = redis_client.get(RobotAccountService._get_access_token_key(email))
  35. logging.info(f"access_token: {access_token}")
  36. return access_token
  37. @staticmethod
  38. def _get_access_token_key(access_token: str) -> str:
  39. return f"{ACCESS_TOKEN_PREFIX}{access_token}"