#!/usr/bin/env python3 """ 认证功能测试脚本 演示如何正确使用 JWT 和 API 密钥认证 """ import asyncio import aiohttp import json from datetime import datetime BASE_URL = "http://localhost:8000" async def test_jwt_authentication(): """测试 JWT 认证""" print("🔐 测试 JWT 认证") print("-" * 50) # 注意:在实际应用中,JWT 令牌应该通过登录端点获取 # 这里我们使用一个示例令牌(在实际环境中需要从登录端点获取) # 模拟 JWT 令牌(实际应用中应该从登录端点获取) jwt_token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbiIsImV4cCI6MTczMjAwMDAwMH0.test" async with aiohttp.ClientSession() as session: # 使用 JWT 令牌访问管理端点 headers = {"Authorization": f"Bearer {jwt_token}"} # 测试访问日志端点 async with session.get(f"{BASE_URL}/api/logs", headers=headers) as response: if response.status == 200: logs = await response.json() print("✅ JWT 认证成功 - 日志访问") print(f" 获取到 {len(logs)} 条日志") else: print(f"❌ JWT 认证失败 - 日志访问: {response.status}") if response.status == 401: print(" 原因: JWT 令牌无效或已过期") print() async def test_api_key_authentication(): """测试 API 密钥认证""" print("🔑 测试 API 密钥认证") print("-" * 50) async with aiohttp.ClientSession() as session: # 首先创建一个 API 密钥(需要管理员权限) # 注意:这里我们使用一个临时的认证方式 # 方法1:直接使用内存中的 API 密钥(仅用于演示) # 在实际应用中,API 密钥应该通过管理界面创建 # 模拟一个有效的 API 密钥 api_key = "test_api_key_12345" headers = {"Authorization": f"Bearer {api_key}"} # 测试访问日志端点 async with session.get(f"{BASE_URL}/api/logs", headers=headers) as response: if response.status == 200: logs = await response.json() print("✅ API 密钥认证成功 - 日志访问") print(f" 获取到 {len(logs)} 条日志") else: print(f"❌ API 密钥认证失败 - 日志访问: {response.status}") if response.status == 401: print(" 原因: API 密钥无效或已撤销") print() async def test_public_endpoints(): """测试公开端点(无需认证)""" print("🌐 测试公开端点") print("-" * 50) async with aiohttp.ClientSession() as session: # 健康检查端点(无需认证) async with session.get(f"{BASE_URL}/health") as response: if response.status == 200: data = await response.json() print("✅ 健康检查端点访问成功") print(f" 状态: {data['status']}") print(f" Jenkins: {data['jenkins']['status']}") else: print(f"❌ 健康检查端点访问失败: {response.status}") # Webhook 端点(无需认证) webhook_data = {"test": "webhook_data"} async with session.post(f"{BASE_URL}/webhook/gitea", json=webhook_data) as response: if response.status == 200: data = await response.json() print("✅ Webhook 端点访问成功") print(f" 响应: {data['message']}") else: print(f"❌ Webhook 端点访问失败: {response.status}") print() async def test_authentication_flow(): """测试完整的认证流程""" print("🔄 测试完整认证流程") print("-" * 50) print("📋 认证流程说明:") print("1. 公开端点: /health, /webhook/gitea - 无需认证") print("2. 管理端点: /api/admin/* - 需要 JWT 或 API 密钥") print("3. 日志端点: /api/logs/* - 需要 JWT 或 API 密钥") print() print("🔧 如何获取认证令牌:") print("1. JWT 令牌: 通过登录端点获取(需要实现登录功能)") print("2. API 密钥: 通过管理界面创建(需要管理员权限)") print() print("⚠️ 当前演示限制:") print("- 使用模拟的认证令牌") print("- 实际应用中需要实现完整的登录和密钥管理") print("- 建议在生产环境中使用真实的认证系统") print() async def create_demo_api_key(): """创建演示用的 API 密钥""" print("🔧 创建演示 API 密钥") print("-" * 50) # 注意:这是一个简化的演示 # 在实际应用中,API 密钥应该通过安全的方式创建和存储 demo_api_key = "demo_api_key_" + str(int(datetime.now().timestamp())) print(f"✅ 演示 API 密钥已创建: {demo_api_key}") print("📝 使用方法:") print(f" curl -H 'Authorization: Bearer {demo_api_key}' {BASE_URL}/api/logs") print() return demo_api_key async def main(): """主测试函数""" print("🚀 开始认证功能测试") print("=" * 60) print() try: # 等待服务启动 await asyncio.sleep(2) await test_public_endpoints() await test_jwt_authentication() await test_api_key_authentication() await test_authentication_flow() # 创建演示 API 密钥 demo_key = await create_demo_api_key() print("=" * 60) print("🎉 认证功能测试完成!") print() print("📚 下一步建议:") print("1. 实现完整的登录系统") print("2. 添加用户管理功能") print("3. 实现 API 密钥的安全存储") print("4. 添加权限控制机制") print("5. 实现会话管理") except Exception as e: print(f"❌ 测试过程中出现错误: {str(e)}") if __name__ == "__main__": asyncio.run(main())