Node.js接入geetest極驗(yàn)行為驗(yàn)證4.0

使用場(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ī)器批量操作膘魄。

產(chǎn)品體驗(yàn)地址

ty.gif

驗(yàn)證碼流程時(shí)序圖

board.png

極驗(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)品

1.png

3灿渴、進(jìn)入【行為驗(yàn)】產(chǎn)品后臺(tái)后洛波,根據(jù)提示選擇【創(chuàng)建業(yè)務(wù)模塊】輸入應(yīng)用名稱(chēng)、應(yīng)用地址逻杖、所屬行業(yè)奋岁。

3.png

4、創(chuàng)建業(yè)務(wù)模塊完成后荸百,點(diǎn)擊【新增業(yè)務(wù)場(chǎng)景】闻伶,輸入場(chǎng)景名稱(chēng)、選擇客戶(hù)端類(lèi)型够话、業(yè)務(wù)類(lèi)型后生成部署所需的 captcha_idcaptcha_key蓝翰。

5.png

驗(yàn)證流程上不會(huì)校驗(yàn)不同場(chǎng)景和客戶(hù)端是否共用一套 idkey,但為區(qū)分驗(yàn)證數(shù)據(jù)和配置不同的驗(yàn)證策略女嘲,建議不同的業(yè)務(wù)場(chǎng)景單獨(dú)創(chuàng)建 idkey 部署

6.png

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)證的有效性钙态。

服務(wù)端部署文檔說(shuō)明

1、獲取 captcha_idcaptcha_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_numbercaptcha_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)接口返回 resultsuccess 時(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 地址
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市变勇,隨后出現(xiàn)的幾起案子恤左,更是在濱河造成了極大的恐慌,老刑警劉巖搀绣,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件飞袋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡豌熄,警方通過(guò)查閱死者的電腦和手機(jī)授嘀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锣险,“玉大人蹄皱,你說(shuō)我怎么就攤上這事览闰。” “怎么了巷折?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵压鉴,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我锻拘,道長(zhǎng)油吭,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任署拟,我火速辦了婚禮婉宰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘推穷。我一直安慰自己心包,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布馒铃。 她就那樣靜靜地躺著蟹腾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪区宇。 梳的紋絲不亂的頭發(fā)上娃殖,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音议谷,去河邊找鬼炉爆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛柿隙,可吹牛的內(nèi)容都是我干的叶洞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼禀崖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼衩辟!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起波附,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤艺晴,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后掸屡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體封寞,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年仅财,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狈究。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盏求,死狀恐怖抖锥,靈堂內(nèi)的尸體忽然破棺而出亿眠,到底是詐尸還是另有隱情,我是刑警寧澤磅废,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布纳像,位于F島的核電站,受9級(jí)特大地震影響拯勉,放射性物質(zhì)發(fā)生泄漏竟趾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一宫峦、第九天 我趴在偏房一處隱蔽的房頂上張望岔帽。 院中可真熱鬧,春花似錦导绷、人聲如沸山卦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至枚碗,卻和暖如春逾一,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肮雨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工遵堵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怨规。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓陌宿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親波丰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子壳坪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容