เอกสารการรวมเซิร์ฟเวอร์
กระบวนการสื่อสารของผลิตภัณฑ์
กระบวนการปกติ
เมื่อบริการยืนยันตัวตนทำงานปกติและเครือข่ายของผู้ใช้โหลดได้ตามปกติ กระบวนการ captcha จะดำเนินการ เซิร์ฟเวอร์จำเป็นต้องให้ความสำคัญกับขั้นตอนการยืนยันตัวตนครั้งที่สอง

กระบวนการในกรณีข้อยกเว้น
กระบวนการ captcha ออฟไลน์
เมื่อบริการยืนยันตัวตนทำงานผิดปกติและใช้โหมดออฟไลน์ของ captcha เซิร์ฟเวอร์จำเป็นต้องให้ความสำคัญกับขั้นตอนการยืนยันตัวตนครั้งที่สอง ในกรณีนี้ คำขอของเซิร์ฟเวอร์ไปยังบริการ captcha จะพบข้อยกเว้น แนะนำให้จับข้อยกเว้นและตัดสินใจว่าจะอนุญาตให้ผู้ใช้ดำเนินการต่อหรือไม่ตามสถานการณ์ทางธุรกิจ

กระบวนการลดระดับแบบกำหนดเอง (สำหรับการอ้างอิงเท่านั้น)
เมื่อบริการยืนยันตัวตนทำงานผิดปกติและใช้การยืนยันตัวตนลดระดับแบบกำหนดเอง เช่น การยืนยันตัวอักษร แนะนำให้เซิร์ฟเวอร์เพิ่มอินเทอร์เฟซหรือสวิตช์สำหรับส่วนหน้าเพื่อกำหนดวิธีการยืนยันตัวตนเฉพาะ เซิร์ฟเวอร์สามารถใช้อินเทอร์เฟซ check_status ที่ captcha ให้มาเพื่อตรวจสอบว่า captcha ทำงานปกติหรือไม่

แผนการรวม captcha ฝั่งเซิร์ฟเวอร์
การเตรียมการก่อนการรวม
รับทรัพยากรที่จำเป็น ที่อยู่โดเมน และข้อมูลอื่น ๆ จากไคลเอนต์การรวม โปรดติดต่อผู้ประสานงานภายในบริษัทหลังการปรับใช้เพื่อรับข้อมูลนี้
| ประเภทไคลเอนต์ | ทรัพยากรที่จำเป็น | คำอธิบายทรัพยากร | เซิร์ฟเวอร์ | captchaId | ID ของสถานการณ์การยืนยันตัวตน สามารถสร้างได้ผ่านคอนโซลการจัดการ |
| captchaKey | KEY ของสถานการณ์การยืนยันตัวตน สร้างขึ้นเมื่อสร้างสถานการณ์ใหม่ในคอนโซลการจัดการ ตรงกับ captchaId แบบหนึ่งต่อหนึ่ง |
การรวมฝั่งเซิร์ฟเวอร์
เมื่อผู้ใช้ผ่าน captcha บนอินเทอร์เฟซส่วนหน้า จะมีการสร้างชุดพารามิเตอร์ที่เกี่ยวข้องกับ captcha คำขอธุรกิจของผู้ใช้จะรวมพารามิเตอร์เหล่านี้ และอินเทอร์เฟซธุรกิจส่วนหลังจะอัปโหลดพารามิเตอร์เหล่านี้ไปยังอินเทอร์เฟซการยืนยันตัวตนครั้งที่สองของ EngageLab เพื่อยืนยันความถูกต้องของการยืนยันตัวตนของผู้ใช้
ตัวอย่างสถานการณ์การเข้าสู่ระบบ:
- ก่อนการรวม captcha ส่วนหน้าจะส่งชื่อผู้ใช้และรหัสผ่านไปยังอินเทอร์เฟซการเข้าสู่ระบบธุรกิจ ฝั่งธุรกิจจะตรวจสอบว่าชื่อผู้ใช้และรหัสผ่านตรงกันหรือไม่ หากตรงกัน ผู้ใช้จะเข้าสู่ระบบ หากไม่ตรงกัน จะปฏิเสธการเข้าสู่ระบบ
- หลังการรวม captcha ส่วนหน้าจะส่งข้อมูลธุรกิจพร้อมกับ พารามิเตอร์ที่เกี่ยวข้องกับ captcha ไปยังอินเทอร์เฟซการเข้าสู่ระบบธุรกิจ ฝั่งธุรกิจจะส่งพารามิเตอร์ที่เกี่ยวข้องกับ captcha ไปยังอินเทอร์เฟซการยืนยันตัวตนครั้งที่สอง (validate) ของเซิร์ฟเวอร์ captcha เพื่อรับผลลัพธ์ captcha โดยพิจารณาจากผลลัพธ์ captcha และผลการจับคู่ชื่อผู้ใช้และรหัสผ่าน จะตัดสินใจว่าจะอนุญาตให้ผู้ใช้ดำเนินการต่อในกระบวนการธุรกิจถัดไปหรือไม่
คำอธิบายอินเทอร์เฟซ validate
| ข้อมูลอินเทอร์เฟซ | คำอธิบาย |
|---|---|
| ที่อยู่ของอินเทอร์เฟซ | https://captcha-api.engagelab.com/validate |
| วิธีการร้องขอ | POST |
| รูปแบบการร้องขอ | application/json |
| ประเภทการตอบกลับ | json |
พารามิเตอร์การร้องขอ
| ชื่อพารามิเตอร์ | ประเภท | คำอธิบาย | แหล่งที่มา |
|---|---|---|---|
| lot_number | string | ID การยืนยันตัวตนของเซิร์ฟเวอร์ | จัดเตรียมโดยส่วนหน้า |
| captcha_output | string | ผลลัพธ์การยืนยันตัวตน | จัดเตรียมโดยส่วนหน้า |
| pass_token | string | โทเค็นผ่านการยืนยันตัวตน | จัดเตรียมโดยส่วนหน้า |
| gen_time | string | เวลาประทับการยืนยันตัวตน | จัดเตรียมโดยส่วนหน้า |
| captcha_id | string | ID สถานการณ์การยืนยันตัวตน | ไฟล์การกำหนดค่าธุรกิจ ต้องตรงกับ captchaId ที่ใช้โดยส่วนหน้า |
| sign_token | string | ลายเซ็นการยืนยันตัวตน | สร้างโดยฝั่งธุรกิจ |
sign_token ถูกสร้างขึ้นดังนี้:
ใช้ lot_number ของการยืนยันตัวตนปัจจุบันเป็นข้อความต้นฉบับ ใช้ captchaKey คีย์ส่วนตัวของลูกค้าเป็นคีย์ และใช้ hmac_sha256 อัลกอริธึมแฮชเพื่อทำการแฮชข้อความและคีย์แบบทางเดียวเพื่อสร้างลายเซ็นสุดท้าย
โค้ด Java ด้านล่างแสดงกระบวนการ:
String signToken = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, captchaKey).hmacHex(lotNumber);
ตัวอย่างเนื้อหาการร้องขอ
{
"lot_number": "f26d13345c9980c7705b9111b9398a0f",
"captcha_id": "59bbe0f128f0624fdd185a6a2207aa54",
"sign_token": "2e61e2f6d40e2896b18978fe6ae1416347fc43027ab7c875460d17ffa149dd7a",
"pass_token": "79a4b7fc89d917b346d35286991bc9bca388a78bd31c20fa00907dcb8632611c",
"gen_time": "1684826917",
"captcha_output": "X4oDQ5p61MhE0Zpy5wQcl98WjrDdlDyL5B_VO0zPYnS9ITuz1ZZ6o0iw4Odk9f0AbAlzraqmeLGSmQWHPwJr2Vvf_Nm2Z0SMCn2ATME67e5UhMdopMgc8_zZi-SFRyH1"
}
พารามิเตอร์การตอบกลับ
| ชื่อพารามิเตอร์ | ประเภท | จำเป็น | ตัวอย่าง | คำอธิบาย |
|---|---|---|---|---|
| status | String | ใช่ | success | สถานะการตอบกลับ success หมายถึงการตอบกลับสำเร็จ |
| data | Object | ใช่ | ดูฟิลด์ data | ส่งคืนเมื่ออินเทอร์เฟซตอบกลับสำเร็จ |
ฟิลด์ data อธิบายดังนี้:
| ชื่อพารามิเตอร์ | ประเภท | จำเป็น | ตัวอย่าง | คำอธิบาย |
|---|---|---|---|---|
| result | String | ใช่ | success | ผลลัพธ์การยืนยันตัวตนครั้งที่สอง success หมายถึงการยืนยันตัวตนผ่าน ค่าอื่นหมายถึงการยืนยันตัวตนล้มเหลว |
| reason | String | ใช่ | "" | คำอธิบายผลลัพธ์การยืนยันตัวตน |
| captcha_args | Object | ใช่ | {} | ข้อมูลที่ส่งคืนให้กับไคลเอนต์ รวมถึงผลลัพธ์กลยุทธ์เป็นหลัก |
ตัวบ่งชี้การยืนยัน captcha ผ่านคือ: ฟิลด์ status ในการตอบกลับคือ success และฟิลด์ result ก็เป็น success
ฟิลด์ captcha_args มีพารามิเตอร์ดังนี้:
| ชื่อพารามิเตอร์ | ประเภท | จำเป็น | ตัวอย่าง | คำอธิบาย |
|---|---|---|---|---|
| model_cnn | int | ใช่ | 0 | ผลการตัดสินแบบจำลอง CNN sliding track 0 หมายถึง track ปกติ 1 หมายถึง track ผิดปกติ |
| model_probability | int | ใช่ | 0 | เป็นคำขอ captcha platform หรือไม่ 0 สำหรับผู้ใช้ปกติ 1 สำหรับคำขอ captcha แนะนำให้ดำเนินการแบบเรียลไทม์โดยธุรกิจ |
| used_type | String | ใช่ | slide | วิธีการยืนยันตัวตนที่ใช้ในครั้งนี้ |
| web_simulator | int | ใช่ | 0 | เป็นซิมูเลเตอร์หรือไม่ 0 หมายถึงเบราว์เซอร์ปกติ 1 หมายถึงซิมูเลเตอร์ |
| user_ip | String | ใช่ | "127.0.0.1" | IP ของผู้ใช้เมื่อการยืนยันตัวตนผ่าน |
| user_referer | String | ใช่ | "" | Referer ของคำขอของผู้ใช้เมื่อการยืนยันตัวตนผ่าน |
| cnn_records | int | ใช่ | 0 | แบบจำลอง sliding คาดการณ์ track ผิดปกติในกระบวนการหรือไม่ |
| user_agent | String | ใช่ | "User-Agent" | UA ของผู้ใช้เมื่อการยืนยันตัวตนผ่าน |
| lot_number | String | ใช่ | "9b57c5289e" | ID การยืนยันตัวตนของผู้ใช้ |
หมายเหตุ: model_probability เป็นตัวบ่งชี้ captcha เมื่อค่าตัวบ่งชี้นี้คือ 1 จะถูกระบุว่าเป็นคำขอ captcha ผิดปกติ แนะนำให้ดำเนินการต่อโดยฝั่งธุรกิจ
เมื่อฟิลด์ result ใน data เป็น success หมายถึงผลลัพธ์การยืนยันตัวตนผ่าน
ตัวอย่างการตอบกลับ
{
"status": "success",
"data": {
"captcha_args": {
"cnn_records": 0,
"lot_number": "a989b864ad08cc08f270c22d9ab1fba0",
"model_cnn": 0,
"model_probability": 0,
"used_type": "slide",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36",
"user_ip": "59.174.224.96",
"user_referer": "http://127.0.0.1:5000/",
"web_simulator": 0
},
"reason": "validate success",
"result": "success"
}
}
#### ตัวอย่างการผสานรวมโค้ด Java
ใช้ด้านธุรกิจที่พัฒนาด้วยภาษา Java เป็นตัวอย่าง โค้ดอ้างอิงมีดังนี้:
```java
package com.engagelab.demo.controller;
import org.apache.commons.codec.digest.HmacAlgorithms;
import org.apache.commons.codec.digest.HmacUtils;
import org.json.JSONObject;
import org.springframework.http.*;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;
@RestController
public class MainController {
@RequestMapping(value = "/login", method = {RequestMethod.GET})
public String userLogin(@RequestParam Map<String, String> getParams) {
// 1. กำหนดค่าพารามิเตอร์เริ่มต้น ซึ่งต้องสอดคล้องกับ captchaId ที่ใช้ในส่วนหน้า และสามารถใส่ในไฟล์การตั้งค่าได้
String captchaId = "37830cbb24f5a2134d39c7cf3093bc14";
String captchaKey = "ab8aeb88a3c30e170ab04af8ada6e6ec";
// domain คือโดเมนบริการ captcha ของ EngageLab
String domain = "https://captcha-api.engagelab.com";
// 2. รับพารามิเตอร์การยืนยันที่ส่งมาจากส่วนหน้าหลังจากการยืนยัน
String lotNumber = getParams.get("lot_number");
String captchaOutput = getParams.get("captcha_output");
String passToken = getParams.get("pass_token");
String genTime = getParams.get("gen_time");
// 3. สร้างลายเซ็น
// ใช้อัลกอริธึม HMAC มาตรฐานเพื่อสร้างลายเซ็น โดยใช้หมายเลขลำดับการยืนยันปัจจุบันของผู้ใช้ lot_number เป็นข้อความต้นฉบับ และใช้คีย์ส่วนตัวของการยืนยันของไคลเอนต์เป็นคีย์
// ใช้อัลกอริธึมแฮช SHA256 เพื่อแฮชข้อความและคีย์ในทิศทางเดียวเพื่อสร้างลายเซ็นสุดท้าย
String signToken = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, captchaKey).hmacHex(lotNumber);
// 4. อัปโหลดพารามิเตอร์การยืนยันไปยังอินเทอร์เฟซการยืนยันขั้นที่สองของ EngageLab เพื่อยืนยันสถานะการยืนยันของผู้ใช้
Map<String, String> queryParams = new HashMap<>();
queryParams.put("captcha_id", captchaId);
queryParams.put("lot_number", lotNumber);
queryParams.put("captcha_output", captchaOutput);
queryParams.put("pass_token", passToken);
queryParams.put("gen_time", genTime);
queryParams.put("sign_token", signToken);
String url = String.format(domain + "/validate");
SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory();
clientHttpRequestFactory.setConnectTimeout(3000); // ตั้งค่าการหมดเวลาการเชื่อมต่อ
clientHttpRequestFactory.setReadTimeout(1500); // ตั้งค่าการหมดเวลาอ่าน
RestTemplate client = new RestTemplate();
client.setRequestFactory(clientHttpRequestFactory);
JSONObject responseJsonObject = new JSONObject();
// ให้ความสำคัญกับข้อยกเว้นของอินเทอร์เฟซ และจัดการข้อยกเว้นที่เกี่ยวข้องเมื่อเกิดข้อยกเว้นในอินเทอร์เฟซการยืนยันขั้นที่สองหรือสถานะการตอบกลับไม่ใช่ 200
// เพื่อให้แน่ใจว่ากระบวนการทางธุรกิจไม่ถูกขัดขวางเนื่องจากการหมดเวลาของคำขออินเทอร์เฟซหรือเซิร์ฟเวอร์ไม่ตอบสนอง
try {
RequestEntity<Map<String, String>> requestEntity = RequestEntity.post(url).accept(MediaType.APPLICATION_JSON).body(queryParams);
ResponseEntity<String> response = client.exchange(requestEntity, String.class);
String resBody = response.getBody();
responseJsonObject = new JSONObject(resBody);
}catch (Exception e){
// Todo: จัดการกรณีที่การเข้าถึงอินเทอร์เฟซหมดเวลา ในตัวอย่างนี้ สมมติว่าการยืนยันสำเร็จโดยค่าเริ่มต้น
responseJsonObject.put("status", "success");
responseJsonObject.put("data", new JSONObject("{\"result\": \"success\", \"reason\": \"request captcha api fail\"}"));
}
// 5. พิจารณาสถานะการยืนยันของผู้ใช้ที่ส่งคืนจาก EngageLab เจ้าของเว็บไซต์ปฏิบัติตามตรรกะทางธุรกิจของตนเอง
JSONObject res = new JSONObject();
// เงื่อนไขสำหรับการยืนยัน captcha ที่สำเร็จคือ: 1. ฟิลด์สถานะใน jsonObject เป็น success และ 2. แอตทริบิวต์ result ในฟิลด์ data ของ jsonObject เป็น success
String status = responseJsonObject.getString("status");
if (status.equals("success")) {
String data = responseJsonObject.getJSONObject("data").getString("result");
if (data.equals("success")) {
res.put("login", "success");
res.put("reason", responseJsonObject.getJSONObject("data").getString("reason"));
} else {
res.put("login", "fail");
res.put("reason", responseJsonObject.getJSONObject("data").getString("reason"));
}
JSONObject captchaArgs = responseJsonObject.getJSONObject("data").getJSONObject("captcha_args");
// ที่นี่ รับผลลัพธ์การจดจำการแคร็กโปรโตคอล ในตัวอย่างนี้ จะบันทึกไว้เท่านั้น ขอแนะนำให้ธุรกิจจัดการตามโมเดลธุรกิจของตนเอง
// model_probability ที่เป็น 0 หมายถึงผู้ใช้ปกติ ในขณะที่ 1 หมายถึงการแคร็กโปรโตคอล กล่าวคือ การเข้าถึงโดยตรงผ่านอินเทอร์เฟซ (crawler)
Integer model_probability = captchaArgs.getInt("model_probability");
System.out.println("ผลลัพธ์การจดจำ crawler ของอินเทอร์เฟซนี้คือ: " + model_probability);
} else {
// อินเทอร์เฟซส่งคืนแต่ล้มเหลว จัดการเป็นการยืนยันล้มเหลว
res.put("login", "fail");
res.put("reason", "captcha verify fail");
}
return res.toString();
}
}










