robot_account_service.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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, AccountStatus, db
  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. if ip_address:
  16. AccountService.update_login_info(account=account, ip_address=ip_address)
  17. if account.status == AccountStatus.PENDING.value:
  18. account.status = AccountStatus.ACTIVE.value
  19. db.session.commit()
  20. access_token = RobotAccountService.get_account_jwt_token(account=account)
  21. access_token_key = RobotAccountService._get_access_token_key(email)
  22. redis_client.setex(access_token_key, ACCESS_TOKEN_EXPIRY, access_token)
  23. return access_token
  24. @staticmethod
  25. def get_account_jwt_token(account: Account) -> str:
  26. exp_dt = datetime.now(UTC) + ACCESS_TOKEN_EXPIRY
  27. exp = int(exp_dt.timestamp())
  28. payload = {
  29. "user_id": account.id,
  30. "exp": exp,
  31. "iss": dify_config.EDITION,
  32. "sub": "Console API Passport",
  33. }
  34. token: str = PassportService().issue(payload)
  35. return token
  36. @staticmethod
  37. def get_account_access_token(email) -> str:
  38. access_token = redis_client.get(RobotAccountService._get_access_token_key(email))
  39. logging.info(f"access_token: {access_token}")
  40. return access_token
  41. @staticmethod
  42. def _get_access_token_key(access_token: str) -> str:
  43. return f"{ACCESS_TOKEN_PREFIX}{access_token}"