Python中前后端分离项目如何使用验证码进行机器人验证

我现在在做一个电商网站项目。
后端使用了,django-rest-framework 作为 api。 前端使用 angular-cli

在关于注册这里遇到了一个问题。
为了防止机器人恶意注册,我想调用验证码来防止机器人。
前端中 angular-cli 接入了谷歌的 recaptcha。已经实现了。
但是,后端该怎么实现呢?? 我阅读了阅读了谷歌的 recaptcha 的文档还是没有找到方法。


Python中前后端分离项目如何使用验证码进行机器人验证
13 回复

我这里用的是 recaptcha V2 中的隐藏徽章类型。
前端验证完成后,生成一段秘文 response。
然后会连同 username,passwork、email 和 response 一起作为验证。
现在问题主要是后端的该怎么处理。


其实,撇开这个 recaptcha,我还有两种思路去处理这个注册验证码问题

## 自行生成验证码
新建一个 captcha 表,
里面给五个字段
分别为:索引 ID、验证码答案、验证码图片地址、秘文 ,创建时间
利用 python 验证码包生成一堆验证码图片,并存入数据库。
用户访问时随机抽取一张验证码图片进行验证等操作。
通过秘文来索引确认用户的验证是否正确。
但是,这个思路缺陷很明显,我用之前练习识别验证码的小 demo都可以识别出这个验证码。
所以,放弃。

## 通过邮箱发送验证码进行验证
这个还是很好做的。
不过用户体验很不好。


在前后端分离项目中,验证码机器人验证通常通过第三方服务(如Google reCAPTCHA、hCaptcha)或自研方案实现。核心流程是:前端展示验证码组件,用户交互后获取令牌(token),后端用密钥验证该令牌的有效性。

以Google reCAPTCHA v3为例,它无需用户交互,通过分数判断是否为机器人。以下是关键代码:

前端(React示例)

import React, { useEffect } from 'react';
function App() {
  const handleSubmit = async (token) => {
    const res = await fetch('/api/verify', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ token })
    });
    const data = await res.json();
    if (data.success) {
      // 验证通过,执行后续操作
    }
  };
  useEffect(() => {
    const script = document.createElement('script');
    script.src = "https://www.google.com/recaptcha/api.js?render=你的站点密钥";
    script.onload = () => {
      window.grecaptcha.ready(() => {
        window.grecaptcha.execute('你的站点密钥', { action: 'submit' })
          .then(token => handleSubmit(token));
      });
    };
    document.head.appendChild(script);
  }, []);
  return <form>...</form>;
}

后端(Python Flask示例)

from flask import Flask, request, jsonify
import requests

app = Flask(__name__)
SECRET_KEY = "你的reCAPTCHA密钥"

@app.route('/api/verify', methods=['POST'])
def verify_captcha():
    token = request.json.get('token')
    resp = requests.post(
        'https://www.google.com/recaptcha/api/siteverify',
        data={'secret': SECRET_KEY, 'response': token}
    ).json()
    if resp.get('success') and resp.get('score', 0) > 0.5:  # 分数阈值可调整
        return jsonify({'success': True})
    return jsonify({'success': False}), 400

if __name__ == '__main__':
    app.run()

对于需要用户交互的reCAPTCHA v2或hCaptcha,前端需渲染挑战组件,后端验证逻辑类似。自研方案可生成图形/算术验证码,将答案存储在session或Redis中供校验。

总结:集成第三方服务更安全便捷。

有接口,后端拿到 authcode 去验证一下;还可以使用 accountkit

我用过腾讯防水墙,免费的,效果还不错,楼主可以试试

搞定了,
Y 的,搞到我写了那么久。
原来是 443 的原因。
是"墙"的原因导致的错误

这个项目是我接了加拿大的外包项目。
尽量不用国内的服务。
已经解决问题了。

怎么设置问题已解决啊??
第一次提问。

防止恶意注册最有效的办法就是用短信验证码验证手机号,一个手机号只能注册一次就完了。

append 附言即可

那是你天朝特色吧。
国外要手机号的服务不多,强行要手机号很大可能劝退用户。
不是每个国家的用户都习惯了被实名制和微信强 J 的。

下面是我解决问题的写法,
主要原因是由于一开始没有设置全局的科学网络导致的 443 错误。
https://github.com/wongjyusing/v2ex/blob/master/test.md
等我完成手头上的两个项目后。
会将整个过程写成博文放到我的博客上。

回到顶部