From ddcf85415e360355e7c3317e68cc62ba46af47ef Mon Sep 17 00:00:00 2001 From: tone <3341154833@qq.com> Date: Wed, 25 Sep 2024 23:22:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E4=BA=BA=E6=9C=BA?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E6=9C=8D=E5=8A=A1Demo=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/CheckCaptcha.ts | 35 +++++++++++++++++++++++++++++++++++ src/api/GetCaptcha.ts | 30 ++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/api/CheckCaptcha.ts create mode 100644 src/api/GetCaptcha.ts diff --git a/src/api/CheckCaptcha.ts b/src/api/CheckCaptcha.ts new file mode 100644 index 0000000..3f6121f --- /dev/null +++ b/src/api/CheckCaptcha.ts @@ -0,0 +1,35 @@ +import { API, RequestData } from "@lib/API/API"; +import ServerStdResponse from "@lib/ServerResponse/ServerStdResponse"; +import { Response } from "express"; +import CaptchaSession from "@lib/Service/CaptchaSession"; +// 验证人机验证 +class CheckCaptcha extends API { + constructor() { + super('POST', '/captcha'); + } + + public async onRequset(data: RequestData, res: Response): Promise { + // 获取session以及angle + const { session, angle } = data; + if (!session || !angle) { + res.json({ ...ServerStdResponse.ERROR }); + return; + } + switch (await CaptchaSession.check(session, angle)) { + case 0:// 验证已过期或服务器错误 + res.json({ ...ServerStdResponse.ERROR, message: 'expired or server error' }); + break; + case 1:// 通过验证 + res.json(ServerStdResponse.OK); + break; + case -1:// 超过最大允许尝试次数 + res.json({ ...ServerStdResponse.ERROR, message: 'max try count' }); + break; + case -2:// 角度差异过大 + res.json({ ...ServerStdResponse.ERROR, message: 'error angle' }); + break; + } + } +} + +export default CheckCaptcha; \ No newline at end of file diff --git a/src/api/GetCaptcha.ts b/src/api/GetCaptcha.ts new file mode 100644 index 0000000..4844336 --- /dev/null +++ b/src/api/GetCaptcha.ts @@ -0,0 +1,30 @@ +import { API, RequestData } from "@lib/API/API"; +import ServerStdResponse from "@lib/ServerResponse/ServerStdResponse"; +import { Response } from "express"; +import crypto from 'crypto' +import CaptchaSession from "@lib/Service/CaptchaSession"; +// 获取人机验证 +class GetCaptcha extends API { + constructor() { + super('GET', '/captcha'); + } + + public async onRequset(data: RequestData, res: Response): Promise { + // 生成角度及session + const angle = Math.floor(60 + 240 * Math.random()); + const session = crypto.createHash('md5').update(`${Math.random()} ${Date.now()}`).digest('hex'); + + // 存储验证信息 + if (await CaptchaSession.add(session, angle)) { + res.json({...ServerStdResponse.OK, data: { + session, + // ... other data + }}) + } else { + this.logger.error(`Failed to store session [${session}] and rotation angle [${angle}]`); + res.json(ServerStdResponse.ERROR); + } + } +} + +export default GetCaptcha; \ No newline at end of file