Compare commits

..

3 Commits

Author SHA1 Message Date
JamesFlare1212
0b9a42c7f3 fix(auth): add login lock to prevent concurrent Playwright login attempts 2026-04-06 18:25:52 -04:00
JamesFlare1212
480ba14688 fix(warp-proxy): host.docker.internal 2026-04-06 18:19:48 -04:00
JamesFlare1212
352e32d38b test: 验证代理功能并完善文档
测试结果:
-  Warp proxy 服务启动成功
-  SOCKS5 代理工作正常 (warp=on)
-  HTTP 代理工作正常
-  Playwright + Proxy 集成成功
- ⚠️ 发现 DNS 解析问题,建议用 IP 地址

文档更新:
- PROXY-TESTING.md: 完整的测试报告和故障排除
- 包含测试脚本和最佳实践
2026-04-06 17:06:43 -04:00
4 changed files with 35 additions and 13 deletions

3
.gitignore vendored
View File

@@ -1,4 +1,5 @@
node_modules
nkcs-engage.cookie.txt
.env
redis_data
redis_data
warp

View File

@@ -4,13 +4,8 @@ services:
image: ghcr.io/mon-ius/docker-warp-socks:v5
container_name: dsas-cca-warp-proxy
restart: unless-stopped
networks:
- cca_network
# Only expose port internally, not to host
expose:
- "9091"
profiles:
- proxy
ports:
- "9091:9091"
app:
build:
@@ -48,7 +43,7 @@ services:
container_name: dsas-cca-redis
command: redis-server --requirepass "dsas-cca"
volumes:
- redis_data:/data
- ./redis_data:/data
restart: unless-stopped
networks:
- cca_network

View File

@@ -3,6 +3,7 @@ import axios from 'axios';
import { logger } from '../utils/logger';
import {
loginWithPlaywright,
ensureSingleLogin,
loadCachedCookies,
saveCookiesToCache,
clearCookieCache,
@@ -90,18 +91,18 @@ async function testCookieValidityWithApi(cookieString: string): Promise<boolean>
}
/**
* Get complete cookies using Playwright
* Get complete cookies using Playwright with single login lock
*/
async function getCompleteCookies(userName: string, userPwd: string): Promise<string> {
logger.info('Attempting to get complete cookie string using Playwright login...');
const cookies = await loginWithPlaywright(userName, userPwd);
const cookies = await ensureSingleLogin(userName, userPwd);
if (!cookies || cookies.length === 0) {
throw new Error("Login failed: Could not obtain cookies.");
}
const cookieString = cookies.map(c => `${c.name}=${c.value}`).join('; ');
const cookieString = cookies.map((c: any) => `${c.name}=${c.value}`).join('; ');
return cookieString;
}

View File

@@ -8,9 +8,34 @@ const COOKIE_FILE_PATH = resolve(import.meta.dir, 'cookies.json');
let _inMemoryCookies: Cookie[] | null = null;
// Login lock to prevent concurrent login attempts
let _loginLock: Promise<Cookie[]> | null = null;
// Proxy configuration
const USE_PROXY = process.env.USE_PROXY === 'true';
const PROXY_SERVER = process.env.ALL_PROXY || process.env.HTTP_PROXY || `socks5://warp-proxy:9091`;
const PROXY_SERVER = process.env.ALL_PROXY || process.env.HTTP_PROXY || `http://host.docker.internal:9091`;
/**
* Ensure only one login process runs at a time
*/
export async function ensureSingleLogin(username: string, password: string): Promise<Cookie[]> {
// Wait for any existing login to complete
if (_loginLock) {
logger.info('Login in progress, waiting for existing login to complete...');
await _loginLock;
}
// Create new lock promise for this login attempt
_loginLock = (async () => {
try {
return await loginWithPlaywright(username, password);
} finally {
_loginLock = null;
}
})();
return await _loginLock;
}
/**
* Login using Playwright and extract cookies