如何用FastAPI测试客户端实现JWT认证?解决未授权报错
解决方案
有两种可行的方式解决这个认证问题,根据你的测试需求选择:
方式一:携带有效JWT令牌发起请求
适合需要完整验证「认证+接口业务逻辑」的测试场景,步骤如下:
- 在测试中先创建一个测试用的管理员账号,存入测试数据库
- 生成该管理员对应的JWT令牌
- 在请求中添加
Authorization请求头,格式为Bearer <生成的token>
修改后的测试代码示例:
def test_create_user(): # 1. 创建测试管理员并存入测试库 db = TestingSessionLocal() # 请根据你的Admin模型实际字段调整 test_admin = Admin(id=1, email="test_admin@example.com", password="hashed_test_pass") db.add(test_admin) db.commit() db.refresh(test_admin) db.close() # 2. 生成JWT令牌(复用你代码中的encode方法) token = encode({"id": test_admin.id}, JWT_SECRET, algorithms=["HS256"]) # 3. 发送带认证头的请求 mail=random_email_user() name =random_name_user() password = random_pasword_user() id=random_int_user() response=client.post( "/api/users", json={"users_email":mail ,"id":id, "users_name": name}, headers={"Authorization": f"Bearer {token}"} ) assert response.status_code == 201, response.text data = response.json() assert data["users_email"] == mail
方式二:测试时跳过认证逻辑
适合仅需验证接口业务逻辑,不想处理认证流程的场景,通过FastAPI的依赖覆盖功能跳过认证:
在你的测试代码中,添加对get_curret_admin依赖的覆盖:
# 原有的数据库依赖覆盖 app.dependency_overrides[get_db] = override_get_db # 新增:覆盖认证依赖,直接返回模拟的管理员对象 def override_get_current_admin(): # 根据你的Admins模型实际字段调整返回内容 return Admins(id=1, email="mock_admin@example.com") app.dependency_overrides[get_curret_admin] = override_get_current_admin client = TestClient(app)
之后你的原测试函数无需修改,直接发送请求即可跳过认证,正常测试接口逻辑。
内容的提问来源于stack exchange,提问作者Wiskani
相关产品推荐
相关产品推荐

