test_oauth.py 4.47 KB
#!/usr/bin/env python3
"""
OAuth2.0 认证测试脚本
用于验证Shoplazza OAuth流程是否正常工作
"""

import requests
import json
import os
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

def test_health_check(base_url):
    """测试健康检查端点"""
    try:
        response = requests.get(f"{base_url}/health")
        if response.status_code == 200:
            print("✅ 健康检查通过")
            print(f"   状态: {response.json()}")
            return True
        else:
            print(f"❌ 健康检查失败: {response.status_code}")
            return False
    except Exception as e:
        print(f"❌ 健康检查异常: {str(e)}")
        return False

def test_auth_endpoints(base_url):
    """测试认证端点"""
    print("\n🔐 测试认证端点...")
    
    # 测试根端点
    try:
        response = requests.get(base_url)
        if response.status_code == 200:
            print("✅ 根端点正常")
            endpoints = response.json().get('endpoints', {})
            print(f"   可用端点: {list(endpoints.keys())}")
        else:
            print(f"❌ 根端点异常: {response.status_code}")
    except Exception as e:
        print(f"❌ 根端点异常: {str(e)}")

def test_oauth_flow(base_url, shop_domain):
    """测试OAuth流程"""
    print(f"\n🔄 测试OAuth流程 (商店: {shop_domain})...")
    
    # 构建认证URL
    auth_url = f"{base_url}/auth/install?shop={shop_domain}"
    print(f"认证URL: {auth_url}")
    
    # 测试认证端点(不跟随重定向)
    try:
        response = requests.get(auth_url, allow_redirects=False)
        if response.status_code in [302, 301]:
            print("✅ 认证重定向正常")
            print(f"   重定向到: {response.headers.get('Location', 'N/A')}")
        else:
            print(f"❌ 认证重定向异常: {response.status_code}")
    except Exception as e:
        print(f"❌ 认证端点异常: {str(e)}")

def test_api_endpoints(base_url, shop_domain):
    """测试API端点"""
    print(f"\n📡 测试API端点 (商店: {shop_domain})...")
    
    endpoints = [
        f"/api/customers/{shop_domain}",
        f"/api/products/{shop_domain}",
        f"/api/orders/{shop_domain}",
        f"/api/shop_info/{shop_domain}"
    ]
    
    for endpoint in endpoints:
        try:
            response = requests.get(f"{base_url}{endpoint}")
            if response.status_code == 401:
                print(f"⚠️  {endpoint} - 需要认证 (正常)")
            elif response.status_code == 200:
                print(f"✅ {endpoint} - 认证成功")
            else:
                print(f"❌ {endpoint} - 异常状态: {response.status_code}")
        except Exception as e:
            print(f"❌ {endpoint} - 异常: {str(e)}")

def test_tokens_endpoint(base_url):
    """测试令牌端点"""
    print("\n🔑 测试令牌端点...")
    
    try:
        response = requests.get(f"{base_url}/auth/tokens")
        if response.status_code == 200:
            tokens = response.json()
            print("✅ 令牌端点正常")
            print(f"   已授权商店: {tokens.get('authorized_shops', [])}")
            if tokens.get('tokens'):
                print(f"   令牌数量: {len(tokens.get('tokens', {}))}")
        else:
            print(f"❌ 令牌端点异常: {response.status_code}")
    except Exception as e:
        print(f"❌ 令牌端点异常: {str(e)}")

def main():
    """主测试函数"""
    print("🚀 Shoplazza OAuth2.0 认证测试")
    print("=" * 50)
    
    # 获取配置
    base_url = os.getenv('BASE_URL', 'http://localhost:3000')
    shop_domain = input("请输入商店域名 (例如: your-shop.myshoplaza.com): ").strip()
    
    if not shop_domain:
        shop_domain = "your-shop.myshoplaza.com"
        print(f"使用默认商店域名: {shop_domain}")
    
    print(f"\n测试配置:")
    print(f"  基础URL: {base_url}")
    print(f"  商店域名: {shop_domain}")
    
    # 执行测试
    if test_health_check(base_url):
        test_auth_endpoints(base_url)
        test_oauth_flow(base_url, shop_domain)
        test_api_endpoints(base_url, shop_domain)
        test_tokens_endpoint(base_url)
    
    print("\n" + "=" * 50)
    print("🎯 测试完成!")
    print("\n下一步操作:")
    print(f"1. 在浏览器中访问: {base_url}/auth/install?shop={shop_domain}")
    print("2. 完成OAuth认证流程")
    print("3. 重新运行此测试脚本验证API调用")

if __name__ == "__main__":
    main()