Python中前后端分离项目如何使用验证码进行机器人验证
我现在在做一个电商网站项目。
后端使用了,django-rest-framework 作为 api。
前端使用 angular-cli
在关于注册这里遇到了一个问题。
为了防止机器人恶意注册,我想调用验证码来防止机器人。
前端中 angular-cli 接入了谷歌的 recaptcha。已经实现了。
但是,后端该怎么实现呢??
我阅读了阅读了谷歌的 recaptcha 的文档还是没有找到方法。
Python中前后端分离项目如何使用验证码进行机器人验证
在前后端分离项目中,验证码机器人验证通常通过第三方服务(如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 的原因。
是"墙"的原因导致的错误
这个项目是我接了加拿大的外包项目。
尽量不用国内的服务。
已经解决问题了。
怎么设置问题已解决啊??
第一次提问。
防止恶意注册最有效的办法就是用短信验证码验证手机号,一个手机号只能注册一次就完了。
那是你天朝特色吧。
国外要手机号的服务不多,强行要手机号很大可能劝退用户。
不是每个国家的用户都习惯了被实名制和微信强 J 的。
多谢。
下面是我解决问题的写法,
主要原因是由于一开始没有设置全局的科学网络导致的 443 错误。
https://github.com/wongjyusing/v2ex/blob/master/test.md
等我完成手头上的两个项目后。
会将整个过程写成博文放到我的博客上。


