You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPIUsers中get_reset_password_router报错AttributeError求助

问题

在FastAPIUsers中注册重置密码路由时出现以下错误:

File "/Users/alexm/Downloads/Dev/news_minds/venv/lib/python3.12/site-packages/fastapi_users/router/reset.py", line 57, in forgot_password
    await user_manager.forgot_password(user, request)
File "/Users/alexm/Downloads/Dev/news_minds/venv/lib/python3.12/site-packages/fastapi_users/manager.py", line 381, in forgot_password
    self.reset_password_token_secret,
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'UserManager' object has no attribute 'reset_password_token_secret'. Did you mean: 'reset_password_token_audience'?

自定义的UserManager类代码如下:

class UserManager(IntegerIDMixin, BaseUserManager):
    async def validate_password(self, password, user):
        if len(password) < 8:
            raise InvalidPasswordException(
                reason='foo'
            )
        if user.email in password:
            raise InvalidPasswordException(
                reason='bar'
            )

    async def on_after_register(self, user, request=None):
        print(f'foobar')

使用版本:FastAPI == 0.115.5 / FastAPIUsers == 14.0.0。BaseUserManager中已定义reset_password_token_secret属性,但仍报错。

解决方案
  • 在自定义UserManager类中直接配置属性:
    在UserManager类里添加重置密码JWT相关配置属性,示例:

    class UserManager(IntegerIDMixin, BaseUserManager):
        # 重置密码JWT配置
        reset_password_token_secret = "你的重置密码密钥字符串"
        reset_password_token_lifetime_seconds = 3600  # 令牌有效期1小时
        # 若需邮箱验证功能,可同步配置对应密钥
        verification_token_secret = "你的邮箱验证密钥字符串"
        verification_token_lifetime_seconds = 86400  # 令牌有效期24小时
    
        async def validate_password(self, password, user):
            # ... 原有验证逻辑 ...
        async def on_after_register(self, user, request=None):
            # ... 原有注册后逻辑 ...
    
  • 实例化时传入配置(推荐用于敏感数据):
    避免硬编码密钥,可通过环境变量等方式在创建UserManager实例时传入参数:

    import os
    from dotenv import load_dotenv
    
    load_dotenv()
    
    def get_user_manager(user_db: SQLAlchemyUserDatabase = Depends(get_user_db)):
        yield UserManager(
            user_db,
            reset_password_token_secret=os.getenv("RESET_PASSWORD_SECRET"),
            reset_password_token_lifetime_seconds=3600,
            verification_token_secret=os.getenv("VERIFICATION_SECRET"),
        )
    
  • 属性类型说明:
    reset_password_token_secret的类型为SecretType,直接传入字符串即可,FastAPI Users会自动处理为安全的Secret类型。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:40:54