使用場(chǎng)景
網(wǎng)站和APP霜运,在所有可能被機(jī)器行為攻擊的場(chǎng)景脾歇,例如但不限于注冊(cè)、登錄淘捡、短信接口藕各、查詢(xún)接口、營(yíng)銷(xiāo)活動(dòng)焦除、發(fā)帖評(píng)論等等激况,都可以部署使用「行為驗(yàn)證」,來(lái)抵御機(jī)器批量操作膘魄。
驗(yàn)證碼流程時(shí)序圖
極驗(yàn)產(chǎn)品后臺(tái)使用
1乌逐、獲取賬號(hào)
如您需體驗(yàn)行為驗(yàn)證 4.0 產(chǎn)品,請(qǐng)事先注冊(cè)極驗(yàn)產(chǎn)品賬號(hào)创葡,可點(diǎn)擊此處提交賬號(hào)申請(qǐng)
2浙踢、通過(guò)注冊(cè)郵箱登錄極驗(yàn)產(chǎn)品后臺(tái)后,選擇【行為驗(yàn)】產(chǎn)品
3灿渴、進(jìn)入【行為驗(yàn)】產(chǎn)品后臺(tái)后洛波,根據(jù)提示選擇【創(chuàng)建業(yè)務(wù)模塊】輸入應(yīng)用名稱(chēng)、應(yīng)用地址逻杖、所屬行業(yè)奋岁。
4、創(chuàng)建業(yè)務(wù)模塊完成后荸百,點(diǎn)擊【新增業(yè)務(wù)場(chǎng)景】闻伶,輸入場(chǎng)景名稱(chēng)、選擇客戶(hù)端類(lèi)型够话、業(yè)務(wù)類(lèi)型后生成部署所需的 captcha_id
和 captcha_key
蓝翰。
驗(yàn)證流程上不會(huì)校驗(yàn)不同場(chǎng)景和客戶(hù)端是否共用一套
id
和key
,但為區(qū)分驗(yàn)證數(shù)據(jù)和配置不同的驗(yàn)證策略女嘲,建議不同的業(yè)務(wù)場(chǎng)景單獨(dú)創(chuàng)建id
和key
部署
5畜份、點(diǎn)擊【部署檢測(cè)】-【跳過(guò)指引】,即可進(jìn)行后續(xù)場(chǎng)景的數(shù)據(jù)查看和驗(yàn)證形式配置等操作
服務(wù)端接入
當(dāng)用戶(hù)在前端界面通過(guò)驗(yàn)證碼后欣尼,會(huì)產(chǎn)生一批與驗(yàn)證碼相關(guān)的參數(shù)爆雹,用戶(hù)的業(yè)務(wù)請(qǐng)求帶上這些參數(shù),后臺(tái)業(yè)務(wù)接口再將這些參數(shù)上傳到極驗(yàn)二次校驗(yàn)接口愕鼓,確認(rèn)該用戶(hù)本次驗(yàn)證的有效性钙态。
1、獲取 captcha_id
和 captcha_key
參考上述步驟登錄極驗(yàn)產(chǎn)品后臺(tái)-業(yè)務(wù)管理菇晃,獲取到服務(wù)端部署所需的 captcha_id
(驗(yàn)證 ID)和 captcha_key
(驗(yàn)證 key)册倒,或聯(lián)系您的項(xiàng)目對(duì)接人獲取。
2磺送、獲取客戶(hù)端驗(yàn)證參數(shù)并簽名
在客戶(hù)端完成驗(yàn)證后驻子,可通過(guò)回調(diào)函數(shù)獲取驗(yàn)證碼相關(guān)參數(shù)灿意,并通過(guò)業(yè)務(wù)自定義接口如注冊(cè)登錄等傳入服務(wù)端,服務(wù)端拿到客戶(hù)端驗(yàn)證參數(shù)后崇呵,需要使用客戶(hù)端驗(yàn)證參數(shù) lot_number
和 captcha_key
參考示例進(jìn)行簽名生成 sign_token
缤剧。
3、上傳驗(yàn)證參數(shù)提交二次校驗(yàn)
將客戶(hù)端和服務(wù)端最終驗(yàn)證參數(shù)提交二次校驗(yàn)接口演熟,進(jìn)行二次校驗(yàn)鞭执,并根據(jù)二次校驗(yàn)返回結(jié)果處理最終的業(yè)務(wù)請(qǐng)求
參數(shù)請(qǐng)求格式請(qǐng)使用 application/x-www-form-urlencoded 格式,否則將返回報(bào)錯(cuò)-50005
4芒粹、處理容災(zāi)降級(jí)邏輯
注意處理二次校驗(yàn)接口異常情況,當(dāng)請(qǐng)求極驗(yàn)二次驗(yàn)證接口異炒罅铮或響應(yīng)狀態(tài)非200時(shí)對(duì)請(qǐng)求進(jìn)行放行處理化漆,避免因?yàn)榻涌谡?qǐng)求超時(shí)或服務(wù)未響應(yīng)而阻礙業(yè)務(wù)流程。
5钦奋、處理業(yè)務(wù)邏輯
根據(jù)極驗(yàn)二次校驗(yàn)接口返回的結(jié)果狀態(tài)座云,進(jìn)行后續(xù)的業(yè)務(wù)邏輯處理:僅當(dāng)二次校驗(yàn)接口返回 result
為 success
時(shí),才允許通過(guò)業(yè)務(wù)流程付材。
服務(wù)端預(yù)計(jì)開(kāi)發(fā)周期:30分鐘
服務(wù)端接入常見(jiàn)問(wèn)題朦拖,請(qǐng)參考此處
6、接入示例
二次校驗(yàn)接口
接口信息 | 說(shuō)明 |
---|---|
接口地址 | http://gcaptcha4.geetest.com/validate |
協(xié)議支持 | https/http |
請(qǐng)求方法 | GET/POST |
請(qǐng)求格式 | application/x-www-form-urlencoded |
返回類(lèi)型 | json |
請(qǐng)求參數(shù)
參數(shù)名 | 類(lèi)型 | 是否必填 | 說(shuō)明 |
---|---|---|---|
lot_number | string | 是 | 驗(yàn)證流水號(hào) |
captcha_output | string | 是 | 驗(yàn)證輸出信息 |
pass_token | string | 是 | 驗(yàn)證通過(guò)標(biāo)識(shí) |
gen_time | string | 是 | 驗(yàn)證通過(guò)時(shí)間戳 |
captcha_id | string | 是 | 驗(yàn)證 id |
sign_token | string | 是 | 驗(yàn)證簽名 |
響應(yīng)參數(shù)
一般只需要處理校驗(yàn)成功和校驗(yàn)失敗時(shí)的返回厌衔,異常返回一般只會(huì)出現(xiàn)在客戶(hù)接入時(shí)沒(méi)有以正確的方式進(jìn)行請(qǐng)求璧帝。
1.校驗(yàn)成功返回示例
{
"status": "success", // 請(qǐng)求狀態(tài)
"result": "success", // 二次校驗(yàn)結(jié)果
"reason": "", // 校驗(yàn)結(jié)果說(shuō)明
"captcha_args": { // 驗(yàn)證輸出參數(shù)
"used_type": "slide",
"user_ip": "127.0.0.1",
"lot_number": "4dc3cfc2cdff448cad8d13107198d473",
"scene": "反爬蟲(chóng)",
"referer": "http://127.0.0.1:8077/"
// ...
}
}
2.校驗(yàn)失敗返回示例
{
"status": "success", // 請(qǐng)求狀態(tài)
"result": "fail", // 二次校驗(yàn)結(jié)果
"reason": "pass_token expire", // 校驗(yàn)結(jié)果說(shuō)明
"captcha_args": { // 驗(yàn)證輸出參數(shù)
...
}
}
3.請(qǐng)求異常返回示例
{
"status": "error", // 請(qǐng)求狀態(tài)
"code": "-50005", // 錯(cuò)誤碼
"msg": "illegal gen_time", // 錯(cuò)誤信息
"desc": { // 錯(cuò)誤描述
"type": "defined error"
}
}
Node.js 接入代碼示例
// 使用 Node.js 框架 express 演示
const express = require('express'); // 導(dǎo)入 Express 模塊
const cors = require('cors'); // 導(dǎo)入 CORS 模塊,用于處理跨域請(qǐng)求
const axios = require('axios'); // 導(dǎo)入 Axios 模塊富寿,用于發(fā)起 HTTP 請(qǐng)求
const crypto = require('crypto');
const app = express(); // 創(chuàng)建 Express 應(yīng)用實(shí)例
app.use(cors()); // 使用 CORS 中間件解決跨越請(qǐng)求
const port = 3000; // 設(shè)置應(yīng)用監(jiān)聽(tīng)的端口號(hào)
// geetest極驗(yàn)配置信息
const geetestConfig = {
id: '7e111794121d87ca0959954f89580e1a', //公鑰 public key
key: '5dcbe6cb44549d3be1a48cbf18dd7bde',// 密鑰 secret key
server:'http://gcaptcha4.geetest.com/validate' // 服務(wù)地址server url
}
// 設(shè)置路由處理函數(shù)睬隶,用于驗(yàn)證
app.get('/login', async (req, res) => {
console.log('login-req', req.query); // 打印請(qǐng)求查詢(xún)參數(shù)
// 收到前端傳來(lái)的參數(shù)
const { captcha_id,lot_number,captcha_output,pass_token,gen_time } = req.query
// 如果沒(méi)有該參數(shù)直接報(bào)錯(cuò)
if(!captcha_id){
throw new Error('請(qǐng)求參數(shù)有誤')
}
// captcha_id 錯(cuò)誤
if(captcha_id !== geetestConfig.id){
throw new Error('請(qǐng)求參數(shù)有誤')
}
// 生成簽名, 使用標(biāo)準(zhǔn)的hmac算法,使用用戶(hù)當(dāng)前完成驗(yàn)證的流水號(hào)lot_number作為原始消息message页徐,使用客戶(hù)驗(yàn)證私鑰作為key
// 采用sha256散列算法將message和key進(jìn)行單向散列生成最終的 “sign_token” 簽名
const sign_token = crypto.createHmac("sha256", geetestConfig.key).update(lot_number, 'utf8').digest('hex');
// 向極驗(yàn)發(fā)送二次校驗(yàn)接口驗(yàn)證苏潜,響應(yīng)json數(shù)據(jù)如:{"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服務(wù)響應(yīng)異常
if(response.status != 200){
throw new Error('Geetest Response Error' + response.status)
}
// 驗(yàn)證失敗
if(response.data.result != 'success'){
throw new Error('Geetest Validate Failed, Reason:' + response.data.reason)
}
// 驗(yàn)證成功返回結(jié)果
res.send(response.data).json();
})
// 監(jiān)聽(tīng)端口
app.listen(port, () => {
console.log(`Example app listening on port ${port}`, `is open url http://127.0.0.1:${port}`)
})
各語(yǔ)言示例demo
開(kāi)發(fā)語(yǔ)言 | 地址 |
---|---|
C# | 地址 |
Golang | 地址 |
Java | 地址 |
Node | 地址 |
Php | 地址 |
Python | 地址 |
Ruby | 地址 |