CaiYouHui后端fastapi实现

12345678910111213141516171819202122232425262728293031
  1. from sqlalchemy import Column, Integer, String, DateTime, Boolean, ForeignKey
  2. from sqlalchemy.orm import relationship
  3. from sqlalchemy.sql import func
  4. from datetime import datetime, timezone, timedelta
  5. from ..database import Base
  6. class Token(Base):
  7. __tablename__ = "tokens"
  8. id = Column(Integer, primary_key=True, index=True)
  9. # Token信息
  10. token = Column(String(500), nullable=False, index=True)
  11. token_type = Column(String(50), nullable=False) # access, refresh, verify, reset
  12. expires_at = Column(DateTime, nullable=False)
  13. is_revoked = Column(Boolean, default=False)
  14. # 用户关联
  15. user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
  16. user = relationship("User", back_populates="tokens")
  17. # 额外信息
  18. ip_address = Column(String(45), nullable=True)
  19. user_agent = Column(String(500), nullable=True)
  20. created_at = Column(DateTime(timezone=True), server_default=func.now())
  21. def is_expired(self):
  22. return datetime.now(timezone.utc) > self.expires_at
  23. def __repr__(self):
  24. return f"<Token {self.token_type} for user {self.user_id}>"