python - 在 django 中使用 google recaptcha V3 的最佳方式
问题描述
首先我应该说我读过这个,这不是我需要的。我想要使用 html/css 而不是 django 表单制作的表单。
而我的方法就是基于这个,其实就是PHP。
我写了代码,它运行良好,但我相信应该有更好的方法来做到这一点。
代码摘要是我提交表单,将数据和谷歌recaptcha令牌发布到我的函数,然后对其进行一些处理,然后根据处理结果重定向到相关页面,我将url和状态返回到再次使用 jQuery,并使用 jQuery 重定向到该页面。
这是我的代码:
登录.html:
<script src="https://www.google.com/recaptcha/api.js?render=here is recaptcha public key"></script>
<!-- login form and etc -->
<script>
$('#loginForm').submit(function() {
// stop what loginform is going to do
event.preventDefault();
var username = $('#username').val();
var password = $("#password").val();
grecaptcha.ready(function () {
grecaptcha.execute("here is recaptcha public key",
{action: "{% url 'basic_app:login_page' %}"}).then(function (token_id)
{$('#loginForm').prepend('<input type="hidden" name="g-recaptcha-response" value="' + token_id + '">');
$.post("{% url 'basic_app:login' %}", // url
{username: username,password: password,
token_id: token_id,csrfmiddlewaretoken: '{{ csrf_token }}'},
function( result ){
console.log(result);
if(result.status == 0) {
window.location.replace(result.url)
} else if (result.status == 1){
window.location.replace(result.url)
}
},
'json');
});
});
});
视图.py:
def user_login(request):
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
token_id = request.POST.get('token_id')
if(token_id):
secretKey = "here is recaptcha secret key"
data = {
'secret': secretKey,
'response': token
}
r = requests.post('https://www.google.com/recaptcha/api/siteverify', data=data)
result = r.json()
....
## some codes for more security
....
response = {'status': 0, 'message':"", 'url': '/'}
return HttpResponse(json.dumps(response), content_type='application/json')
else:
response = {'status': 0, 'message':"", 'url': '/login_page'}
return HttpResponse(json.dumps(response), content_type='application/json')
....
这种方法有什么安全问题吗?
有什么方法可以编写更好的代码来使用 recaptcha V3 吗?谢谢你。
解决方案
更好的步骤:
- 当用户点击提交时,防止默认行为
- 在 onSubmit 中,执行 g-recaptcha 并将令牌存储在表单中
- 像下面的教程一样调用 this.submit() 或 form.submit()
- 在您的视图中验证验证码。
推荐阅读
- c++ - 在 C/C++ 中加载 OpenSSL 自定义引擎
- spring-boot - 带有 Spring 启动的 Azure 活动目录
- html - 试图让一个链接在弹出框内工作
- powershell - 编辑 PowerShell 自定义提示功能时遇到问题
- c# - 使用 Interop 打开 PowerPoint 文件在一台用户计算机上挂起
- c# - Azure 代理,请求 IIS 托管 API 时出现 CORS 错误
- javascript - 如何从firebase检索数据并将数据与Javascript中的字符串进行比较?
- html - 为什么应用边距底部时,“Img”类型的输入表现不同?
- c# - GameAnalytics 广告事件展示未显示在仪表板中
- matrix - 将 HTML div 的 3D 位置和方向与动画 Three.js 平面 Object3D 对齐