I'm always getting Success: False on my Json response when using Google ReCaptcha v3 on a second page of my blazor app. Do I need 2 seperate sets of keys or something? I tried using different action names, doesn't work, tried using different instances of my GoogleCAPTCHAv3Service and that didn't work either. Here's the code:
Start.razor
protected override async Task OnAfterRenderAsync(bool firstRender){ if (UserSession.xxxx != Guid.Empty) DatabaseErrorClear(); if (firstRender) { CurrentModel = await StartService.GetStart(UserSession.xxx); if (AppSettings.Google.Captcha.AlwaysOn == true && AppSettings.Google.Captcha.Toggle == true) { CurrentModel.requireCaptcha = true; } if (CurrentModel.requireCaptcha) { token = await JSRuntime.InvokeAsync<string>("runCaptcha", AppSettings.Google.Captcha.SiteKey, "start"); await JSRuntime.InvokeVoidAsync("console.log", token); } if (CurrentModel.xxxxxx == null || CurrentModel.xxxxx?.xxxxx == null) { LoadError = "Error loading xxxxx. Please try again later."; DisableSubmit(false); } ModelLoaded = true; StateHasChanged(); } await base.OnAfterRenderAsync(firstRender);}private async Task checkCaptcha(){ if(CurrentModel.requireCaptcha == false) { HandleValidSubmit(); } else if (CurrentModel.requireCaptcha == true) { googlereCAPTCHAv3Response = await GooglereCAPTCHAv3Service.Verify(token); CaptchaResponse = JsonSerializer.Serialize<GooglereCAPTCHAv3Response>(googlereCAPTCHAv3Response); await JSRuntime.InvokeVoidAsync("console.log", googlereCAPTCHAv3Response); StateHasChanged(); if (googlereCAPTCHAv3Response.score > AppSettings.Google.Captcha.CutOffScore && googlereCAPTCHAv3Response.success == true) { Log.Verbose("Google reCAPTCHA v3 score passed: " + CaptchaResponse); HandleValidSubmit(); } else if (googlereCAPTCHAv3Response.score <= AppSettings.Google.Captcha.CutOffScore && googlereCAPTCHAv3Response.success == true) { Log.Verbose("Google reCAPTCHA v3 score failed: " + CaptchaResponse); await RepoCollection.EventLog.Store(Data.EventLog.Type.ReCaptchaStart, "Google reCAPTCHA v3 score failed: " + CaptchaResponse, null, AppContext); await JSRuntime.InvokeVoidAsync("alert", "Bot Detected"); } else if (googlereCAPTCHAv3Response.success == false) { Log.Verbose("Google reCAPTCHA v3 token response failed: " + CaptchaResponse); await RepoCollection.EventLog.Store(Data.EventLog.Type.ReCaptchaStart, "Google reCAPTCHA v3 token response failed: " + CaptchaResponse, null, AppContext); await JSRuntime.InvokeVoidAsync("alert", "Google reCAPTCHA v3 token response failed: "); } } else { HandleValidSubmit(); }} private async Task HandleValidSubmit() { DisableSubmit(); var isNewxxx = UserSession.xxxx == Guid.Empty; //Create/Update app if (await StartService.SaveStart(CurrentModel)) { if (googlereCAPTCHAv3Response.score > AppSettings.Google.Captcha.CutOffScore && googlereCAPTCHAv3Response.success == true) { await GooglereCAPTCHAv3Service.SendRisk(googlereCAPTCHAv3Response, UserSession, RepoCollection); await RepoCollection.EventLog.Store(Data.EventLog.Type.ReCaptchaStart, "Google reCAPTCHA v3 score passed: " + CaptchaResponse, UserSession.xxxx, xxxxx); token = ""; } if (isNewApp) await RepoCollection.EventLog.Store(Data.EventLog.Type.AppStart, null, UserSession.xxxx, AppContext); if (UserSession.Internal) NavigationManager.NavigateTo($"/name"); else NavigationManager.NavigateTo($"/otpmethod"); } else HandleDatabaseError(); }googlereCaptcha.js
function runCaptcha(googleCaptchaSiteKey, page) { return new Promise((resolve, reject) => { grecaptcha.ready(function () { grecaptcha.execute(googleCaptchaSiteKey, { action: page }).then(function (token) { resolve(token); }); }); });};GooglereCAPTCHAv3Service
public virtual async Task<GooglereCAPTCHAv3Response?> Verify(string token) { GooglereCAPTCHAv3Response? reCaptchaResponse; using (var httpClient = new HttpClient()) { var appsettings = AppSettings.xxxxx(); var content = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("secret", appsettings.Google.Captcha.SecretKey), new KeyValuePair<string, string>("response", token), }); try { var response = await httpClient.PostAsync($"https://www.google.com/recaptcha/api/siteverify", content); var jsonString = await response.Content.ReadAsStringAsync(); reCaptchaResponse = JsonSerializer.Deserialize<GooglereCAPTCHAv3Response>(jsonString); Console.WriteLine(reCaptchaResponse); if (appsettings.Google.Captcha.CaptchaTestingMode.On == true) { reCaptchaResponse.score = appsettings.Google.Captcha.CaptchaTestingMode.TestingScore; reCaptchaResponse.success = appsettings.Google.Captcha.CaptchaTestingMode.TokenSuccess; } } catch (Exception) { throw; } content = null; return reCaptchaResponse; } }InviteJoint.razor
protected override async Task OnInitializedAsync() { SaveMessage = ""; ValidationError = ""; Render = await ShouldRenderCustom(); // Init if (AppSettings.JointInviteFeatureOn) xxxxxxx = JointInfoMethod.xxxxxx; else xxxxxxx = JointInfoMethod.xxxxxx; if (Render) { if (AppSettings.Google.Captcha.AlwaysOn == true && AppSettings.Google.Captcha.Toggle == true) { JointModel.requireCaptcha = true; } if (JointModel.requireCaptcha) { token = await JSRuntime.InvokeAsync<string>("runCaptcha", AppSettings.Google.Captcha.SiteKey, "joint"); await JSRuntime.InvokeVoidAsync("console.log", token); } } else NavigationManager.NavigateTo($"/"); await base.OnInitializedAsync(); }private async Task CheckCaptcha() { if (JointModel.requireCaptcha == false) { HandleValidSubmit(); } else if (JointModel.requireCaptcha == true) { googlereCAPTCHAv3Response = await GooglereCAPTCHAv3Service.Verify(token); CaptchaResponse = JsonSerializer.Serialize<GooglereCAPTCHAv3Response>(googlereCAPTCHAv3Response); await JSRuntime.InvokeVoidAsync("console.log", googlereCAPTCHAv3Response); StateHasChanged(); if (googlereCAPTCHAv3Response.score > AppSettings.Google.Captcha.CutOffScore && googlereCAPTCHAv3Response.success == true) { Log.Verbose("Google reCAPTCHA v3 score passed: " + CaptchaResponse); HandleValidSubmit(); } else if (googlereCAPTCHAv3Response.score <= AppSettings.Google.Captcha.CutOffScore && googlereCAPTCHAv3Response.success == true) { Log.Verbose("Google reCAPTCHA v3 score failed: " + CaptchaResponse); await RepoCollection.EventLog.Store(Data.EventLog.Type.ReCaptchaJoint, "Google reCAPTCHA v3 score failed: " + CaptchaResponse, null, AppContext); await JSRuntime.InvokeVoidAsync("alert", "Bot Detected"); } else if (googlereCAPTCHAv3Response.success == false) { Log.Verbose("Google reCAPTCHA v3 token response failed: " + CaptchaResponse); await RepoCollection.EventLog.Store(Data.EventLog.Type.ReCaptchaJoint, "Google reCAPTCHA v3 token response failed: " + CaptchaResponse, null, AppContext); await JSRuntime.InvokeVoidAsync("alert", "Google reCAPTCHA v3 token response failed: "); } } else { HandleValidSubmit(); } }private async Task HandleValidSubmit() { if (googlereCAPTCHAv3Response.score > AppSettings.Google.Captcha.CutOffScore && googlereCAPTCHAv3Response.success == true) { await GooglereCAPTCHAv3Service.SendRisk(googlereCAPTCHAv3Response, UserSession, RepoCollection); await RepoCollection.EventLog.Store(Data.EventLog.Type.ReCaptchaStart, "Google reCAPTCHA v3 score passed: " + CaptchaResponse, UserSession.AppId, AppContext); token = ""; } if (xxxxxx == JointInfoMethod.xxxxxx && string.IsNullOrEmpty(JointModel.xxxxx)) { ValidationError = "Please provide a xxxxxx."; await Task.Delay(5000); ValidationError = ""; StateHasChanged(); return; } if (xxxxxx == JointInfoMethod.xxxxxx && string.IsNullOrEmpty(JointModel.xxxx)) { ValidationError = "Please provide an xxxxxx."; await Task.Delay(5000); ValidationError = ""; StateHasChanged(); return; } if (xxxxxx == JointInfoMethod.xxxxxx) await xxxxxxx(); else await xxxxxxx(); EnableSubmit(); }Response from start page:
Objectaction:"start"challenge_ts:"2024-11-19T15:37:13Z"hostname:"localhost"score:0.9success:true
Response from InviteJoint page
{"success": false,"score": 0,"action": null,"challenge_ts": "0001-01-01T00:00:00","hostname": null}