Eric Tilton
Eric Tilton

Reputation: 56

Google ReCaptcha V3 only works on one page of Blazor App

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

Answers (0)

Related Questions