Node.js接入geetest極驗行為驗證4.0
使用場景
網站和APP,在所有可能被機器行為攻擊的場景,例如但不限於註冊、登錄、短信接口、查詢接口、營銷活動、發帖評論等等,都可以部署使用「行為驗證」,來抵禦機器批量操作。
產品體驗地址
驗證碼流程時序圖
極驗產品後台使用
1、獲取賬號
如您需體驗行為驗證 4.0 產品,請事先註冊極驗產品賬號,可點擊此處提交賬號申請
2、通過註冊郵箱登錄極驗產品後台後,選擇【行為驗】產品
3、進入【行為驗】產品後台後,根據提示選擇【創建業務模塊】輸入應用名稱、應用地址、所屬行業。
4、創建業務模塊完成後,點擊【新增業務場景】,輸入場景名稱、選擇客户端類型、業務類型後生成部署所需的 captcha_id 和 captcha_key。
驗證流程上不會校驗不同場景和客户端是否共用一套id和key,但為區分驗證數據和配置不同的驗證策略,建議不同的業務場景單獨創建id和key部署
5、點擊【部署檢測】-【跳過指引】,即可進行後續場景的數據查看和驗證形式配置等操作
服務端接入
當用户在前端界面通過驗證碼後,會產生一批與驗證碼相關的參數,用户的業務請求帶上這些參數,後台業務接口再將這些參數上傳到極驗二次校驗接口,確認該用户本次驗證的有效性。
服務端部署文檔説明
1、獲取 captcha_id 和 captcha_key
參考上述步驟登錄極驗產品後台-業務管理,獲取到服務端部署所需的 captcha_id(驗證 ID)和 captcha_key(驗證 key),或聯繫您的項目對接人獲取。
2、獲取客户端驗證參數並簽名
在客户端完成驗證後,可通過回調函數獲取驗證碼相關參數,並通過業務自定義接口如註冊登錄等傳入服務端,服務端拿到客户端驗證參數後,需要使用客户端驗證參數 lot_number 和 captcha_key 參考示例進行簽名生成 sign_token。
3、上傳驗證參數提交二次校驗
將客户端和服務端最終驗證參數提交二次校驗接口,進行二次校驗,並根據二次校驗返回結果處理最終的業務請求
參數請求格式請使用 application/x-www-form-urlencoded 格式,否則將返回報錯-50005
4、處理容災降級邏輯
注意處理二次校驗接口異常情況,當請求極驗二次驗證接口異常或響應狀態非200時對請求進行放行處理,避免因為接口請求超時或服務未響應而阻礙業務流程。
5、處理業務邏輯
根據極驗二次校驗接口返回的結果狀態,進行後續的業務邏輯處理:僅當二次校驗接口返回 result 為 success 時,才允許通過業務流程。
服務端預計開發週期:30分鐘
服務端接入常見問題,請參考此處
6、接入示例
二次校驗接口
| 接口信息 | 説明 |
|---|---|
| 接口地址 | http://gcaptcha4.geetest.com/validate |
| 協議支持 | https/http |
| 請求方法 | GET/POST |
| 請求格式 | application/x-www-form-urlencoded |
| 返回類型 | json |
請求參數
| 參數名 | 類型 | 是否必填 | 説明 |
|---|---|---|---|
| lot_number | string | 是 | 驗證流水號 |
| captcha_output | string | 是 | 驗證輸出信息 |
| pass_token | string | 是 | 驗證通過標識 |
| gen_time | string | 是 | 驗證通過時間戳 |
| captcha_id | string | 是 | 驗證 id |
| sign_token | string | 是 | 驗證簽名 |
響應參數
一般只需要處理校驗成功和校驗失敗時的返回,異常返回一般只會出現在客户接入時沒有以正確的方式進行請求。
1.校驗成功返回示例
{
"status": "success", // 請求狀態
"result": "success", // 二次校驗結果
"reason": "", // 校驗結果説明
"captcha_args": { // 驗證輸出參數
"used_type": "slide",
"user_ip": "127.0.0.1",
"lot_number": "4dc3cfc2cdff448cad8d13107198d473",
"scene": "反爬蟲",
"referer": "http://127.0.0.1:8077/"
// ...
}
}
2.校驗失敗返回示例
{
"status": "success", // 請求狀態
"result": "fail", // 二次校驗結果
"reason": "pass_token expire", // 校驗結果説明
"captcha_args": { // 驗證輸出參數
...
}
}
3.請求異常返回示例
{
"status": "error", // 請求狀態
"code": "-50005", // 錯誤碼
"msg": "illegal gen_time", // 錯誤信息
"desc": { // 錯誤描述
"type": "defined error"
}
}
Node.js 接入代碼示例
// 使用 Node.js 框架 express 演示
const express = require('express'); // 導入 Express 模塊
const cors = require('cors'); // 導入 CORS 模塊,用於處理跨域請求
const axios = require('axios'); // 導入 Axios 模塊,用於發起 HTTP 請求
const crypto = require('crypto');
const app = express(); // 創建 Express 應用實例
app.use(cors()); // 使用 CORS 中間件解決跨越請求
const port = 3000; // 設置應用監聽的端口號
// geetest極驗配置信息
const geetestConfig = {
id: '7e111794121d87ca0959954f89580e1a', //公鑰 public key
key: '5dcbe6cb44549d3be1a48cbf18dd7bde',// 密鑰 secret key
server:'http://gcaptcha4.geetest.com/validate' // 服務地址server url
}
// 設置路由處理函數,用於驗證
app.get('/login', async (req, res) => {
console.log('login-req', req.query); // 打印請求查詢參數
// 收到前端傳來的參數
const { captcha_id,lot_number,captcha_output,pass_token,gen_time } = req.query
// 如果沒有該參數直接報錯
if(!captcha_id){
throw new Error('請求參數有誤')
}
// captcha_id 錯誤
if(captcha_id !== geetestConfig.id){
throw new Error('請求參數有誤')
}
// 生成簽名, 使用標準的hmac算法,使用用户當前完成驗證的流水號lot_number作為原始消息message,使用客户驗證私鑰作為key
// 採用sha256散列算法將message和key進行單向散列生成最終的 “sign_token” 簽名
const sign_token = crypto.createHmac("sha256", geetestConfig.key).update(lot_number, 'utf8').digest('hex');
// 向極驗發送二次校驗接口驗證,響應json數據如:{"result": "success", "reason": "", "captcha_args": {}}
const response = await axios({
method: "get",
url:`${geetestConfig.server}`,
params: {
captcha_id,
lot_number,
captcha_output,
pass_token,
gen_time,
sign_token
},
});
// geetest服務響應異常
if(response.status != 200){
throw new Error('Geetest Response Error' + response.status)
}
// 驗證失敗
if(response.data.result != 'success'){
throw new Error('Geetest Validate Failed, Reason:' + response.data.reason)
}
// 驗證成功返回結果
res.send(response.data).json();
})
// 監聽端口
app.listen(port, () => {
console.log(`Example app listening on port ${port}`, `is open url http://127.0.0.1:${port}`)
})
各語言示例demo
| 開發語言 | 地址 |
|---|---|
| C# | 地址 |
| Golang | 地址 |
| Java | 地址 |
| Node | 地址 |
| Php | 地址 |
| Python | 地址 |
| Ruby | 地址 |