Reputation: 56
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:
Object action : "start" challenge_ts : "2024-11-19T15:37:13Z" hostname : "localhost" score : 0.9 success : true
Response from InviteJoint page
{ "success": false, "score": 0, "action": null, "challenge_ts": "0001-01-01T00:00:00", "hostname": null }
Upvotes: 0
Views: 110