1- from django . shortcuts import render , redirect
2- from django .contrib . auth import authenticate , login , logout
1+ import requests
2+ from django .conf import settings
33from django .contrib import messages
4+ from django .contrib .auth import authenticate , login , logout
5+ from django .shortcuts import redirect , render
6+
47from .forms import LoginForm
58
9+ TURNSTILE_VERIFY_URL = "https://challenges.cloudflare.com/turnstile/v0/siteverify"
10+
11+
12+ def verify_turnstile (token , ip = None ):
13+ data = {
14+ "secret" : settings .CLOUDFLARE_TURNSTILE_SECRET_KEY ,
15+ "response" : token ,
16+ }
17+ if ip :
18+ data ["remoteip" ] = ip
19+
20+ r = requests .post (TURNSTILE_VERIFY_URL , data = data , timeout = 5 )
21+ return r .json ()
22+
623
724def user_login (request ):
825 if request .user .is_authenticated :
@@ -12,6 +29,16 @@ def user_login(request):
1229 form = LoginForm (initial = {"next" : initial_next })
1330
1431 if request .method == "POST" :
32+ # cf turnstile
33+ token = request .POST .get ("cf-turnstile-response" )
34+ if not token :
35+ messages .error (request , "Captcha missing." )
36+ return redirect ("login" )
37+ result = verify_turnstile (token , request .META .get ("REMOTE_ADDR" ))
38+ if not result .get ("success" ):
39+ messages .error (request , "Captcha failed. Try again." )
40+
41+ # auth
1542 form = LoginForm (request .POST )
1643 if form .is_valid ():
1744 username = form .cleaned_data ["username" ]
@@ -24,7 +51,11 @@ def user_login(request):
2451 else :
2552 messages .error (request , "Invalid username or password." )
2653
27- return render (request , "auth/login.html" , {"form" : form })
54+ return render (
55+ request ,
56+ "auth/login.html" ,
57+ {"form" : form , "TURNSTILE_SITE_KEY" : settings .CLOUDFLARE_TURNSTILE_SITE_KEY },
58+ )
2859
2960
3061def user_logout (request ):
0 commit comments