博客 / 詳情

返回

Node.js接入geetest極驗行為驗證4.0

Node.js接入geetest極驗行為驗證4.0

使用場景

網站和APP,在所有可能被機器行為攻擊的場景,例如但不限於註冊、登錄、短信接口、查詢接口、營銷活動、發帖評論等等,都可以部署使用「行為驗證」,來抵禦機器批量操作。

產品體驗地址

驗證碼流程時序圖

sxt

極驗產品後台使用

1、獲取賬號

如您需體驗行為驗證 4.0 產品,請事先註冊極驗產品賬號,可點擊此處提交賬號申請

2、通過註冊郵箱登錄極驗產品後台後,選擇【行為驗】產品

圖片

3、進入【行為驗】產品後台後,根據提示選擇【創建業務模塊】輸入應用名稱、應用地址、所屬行業。

4、創建業務模塊完成後,點擊【新增業務場景】,輸入場景名稱、選擇客户端類型、業務類型後生成部署所需的 captcha_idcaptcha_key

驗證流程上不會校驗不同場景和客户端是否共用一套 idkey,但為區分驗證數據和配置不同的驗證策略,建議不同的業務場景單獨創建 idkey 部署

5、點擊【部署檢測】-【跳過指引】,即可進行後續場景的數據查看和驗證形式配置等操作

服務端接入

當用户在前端界面通過驗證碼後,會產生一批與驗證碼相關的參數,用户的業務請求帶上這些參數,後台業務接口再將這些參數上傳到極驗二次校驗接口,確認該用户本次驗證的有效性。

服務端部署文檔説明

1、獲取 captcha_idcaptcha_key

參考上述步驟登錄極驗產品後台-業務管理,獲取到服務端部署所需的 captcha_id(驗證 ID)和 captcha_key(驗證 key),或聯繫您的項目對接人獲取。

2、獲取客户端驗證參數並簽名

在客户端完成驗證後,可通過回調函數獲取驗證碼相關參數,並通過業務自定義接口如註冊登錄等傳入服務端,服務端拿到客户端驗證參數後,需要使用客户端驗證參數 lot_numbercaptcha_key 參考示例進行簽名生成 sign_token

3、上傳驗證參數提交二次校驗

將客户端和服務端最終驗證參數提交二次校驗接口,進行二次校驗,並根據二次校驗返回結果處理最終的業務請求

參數請求格式請使用 application/x-www-form-urlencoded 格式,否則將返回報錯-50005

4、處理容災降級邏輯

注意處理二次校驗接口異常情況,當請求極驗二次驗證接口異常或響應狀態非200時對請求進行放行處理,避免因為接口請求超時或服務未響應而阻礙業務流程。

5、處理業務邏輯

根據極驗二次校驗接口返回的結果狀態,進行後續的業務邏輯處理:僅當二次校驗接口返回 resultsuccess 時,才允許通過業務流程。

服務端預計開發週期: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 地址
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.