Sdílet prostřednictvím


Integrace vlastní služby CAPTCHA s formuláři Customer Insights - Journeys

Formuláře Customer Insights - Journeys umožňují používat vlastní ochranu captcha před roboty k ověřování odesílání formulářů. Tento článek uvádí příklad, jak integrovat Google reCAPTCHA. Tento tok je podobný i pro ostatní služby captcha.

Poznámka:

V současné verzi aplikace může být aktivní pouze jedna implementace captcha. Pokud používáte vlastního poskytovatele captcha (jak je popsáno níže), stávající formuláře, které používají předpřipravné captcha, přestanou fungovat. Vlastní implementace captcha vyžaduje alespoň základní znalosti psaní a ladění modulů plug-in dataverse.

Proces se skládá z těchto kroků:

  1. Přidání reCAPTCHA do formuláře.
  2. Do odeslání formuláře přidejte textovou hodnotu captcha, která se aktivuje odesláním formuláře.
  3. Vytvořte modul plug-in v CRM, který ověřuje captcha.

Podrobný příklad: Integrace Google reCAPTCHA

1. Přidání reCAPTCHA do formuláře

  1. Vytvořte formulář v editoru formulářů Customer Insights - Journeys.

  2. Přidejte atribut data-validate-submission="true" do prvku <form>, který umožní vlastní ověření při odeslání formuláře:

    Přidání atributu do prvku formuláře.

  3. Přidejte <div id="g-recaptcha"> do formuláře jako zástupný symbol pro reCAPTCHA. Toto ID div se později použije jako reference. Doporučuje se umístit zástupný symbol mezi poslední pole a tlačítko Odeslat.

    Přidejte zástupný symbol pro reCAPTCHA.

  4. Publikujte formulář a vložte jej na svůj web.

  5. Upravte stránku, kam byl formulář vložen. Přidejte skript poskytnutý společností Google do záhlaví stránky. Tento skript načte reCAPTCHA s parametrem zpětného volání onLoad. Toto zpětné volání je voláno, jakmile je načteno captcha.

    <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback" async defer></script>
    
  6. Přidejte funkci onLoadCallback:

    function onloadCallback() {
        grecaptcha.render('g-recaptcha',
        { 
          sitekey: '{sitekey}',
        });
    }
    

    Nahraďte zástupný symbol {sitekey} zástupným symbolem poskytnutým společností Google. Tato funkce zpětného volání vykreslí reCAPTCHA uvnitř zástupného symbolu <div id="g-recaptcha">, který jste vytvořili dříve.

  7. Zaregistrujte funkci onloadCallback, kterou zavolá zavaděč formuláře:

document.addEventListener("d365mkt-afterformload", onloadCallback);

2. Přidání textové hodnoty captcha do odeslání formuláře

Jakmile je formulář odeslán, parametr g-recaptcha-response se automaticky přidá do odeslání formuláře. V dalších krocích vytvoříte modul plug-in, který tuto hodnotu skryje, protože bude přidána do seznamu ValidationOnlyFields v objektu odpovědi vráceném kódem modulu plug-in.

Je přidán parametr G-recaptcha-response.

3. Vytvoření modulu plug-in

3.1 Vytvoření projektu Visual Studio pro modul plug-in

  1. Otevřete Visual Studio a vytvořte nový projekt knihovny tříd pomocí rozhraní .NET Framework 4.6.2.
  2. V Průzkumníku řešení vyberte Spravovat balíčky NuGet a nainstalujte Microsoft.CrmSdk.CoreAssemblies.

3.2 Vytvoření třídu modulů plug-in

  1. Přejmenujte Class1.cs na CustomValidationPlugin.cs.

  2. Zajistěte, aby třída CustomValidationPlugin dědila z rozhraní IPlugin a přidejte metodu Execute.

    public class CustomValidationPlugin : IPlugin
    {
       public void Execute(IServiceProvider serviceProvider)
       {
    
       }
    }
    
  3. Do metody spuštění přidejte následující kód, abyste načetli kontext a službu trasování.

    public void Execute(IServiceProvider serviceProvider)
    {
       // get tracing service
       ITracingService tracingService =
       (ITracingService)serviceProvider.GetService(typeof(ITracingService));
    
       // get plugin execution context
       IPluginExecutionContext context = (IPluginExecutionContext)
       serviceProvider.GetService(typeof(IPluginExecutionContext));
    }
    
  4. Přidejte tento kód, abyste načetli řetězec parametru odeslání formuláře. Je to řetězec kódovaný JSON představující pole, která uživatel odeslal ve formuláři. Tento proces načte tento řetězec a deserializuje jej pomocí pomocné metody Deserialize a třídy FormSubmissionRequest, která je definována později. Tím se zkontroluje, že pole Pole obsahuje klíč pro g-recaptcha-response. Pokud klíč reCAPTCHA není nalezen, vrátí se přeskočení ověření, protože zpracovávaný formulář neobsahoval prvek Google reCAPTCHA.

    var requestString = (string)context.InputParameters["msdynmkt_formsubmissionrequest"];
    var requestObject = Deserialize<FormSubmissionRequest>(requestString);
    if (!requestObject.Fields.TryGetValue("g-recaptcha-response", out string recaptchaToken))
    {
       tracingService.Trace("g-recaptcha-response was not present in form submission");
       return;
    }
    
  5. Přidejte následující kód, aby bylo vráceno, zda je hodnota g-recaptcha-token null nebo prázdná.

    if (String.IsNullOrEmpty(recaptchaToken))
    {
       tracingService.Trace($"g-recaptcha-response value not found");
       return;
    }
    
  6. Přidejte následující kód, abyste ověřili token Google captcha prostřednictvím rozhraní Google API.

    string url = "https://www.google.com/recaptcha/api/siteverify";
    using (HttpClient client = new HttpClient())
    {
       var content = new FormUrlEncodedContent(new Dictionary<string, string>
       {
          {"secret", "your_secret_key"},
          {"response", recaptchaToken}
       });
    
       try
       {
          var response = client.PostAsync(url, content).Result;
          if (!response.IsSuccessStatusCode)
          {
             tracingService.Trace($"Request Failed: ({response.StatusCode}){response.Content}");
             return;
          }
    
          var responseString = response.Content.ReadAsStringAsync().Result;
    
          gRecaptchaResponse = Deserialize<GRecaptchaResponse>(responseString);
    
          var resp = new ValidateFormSubmissionResponse()
          {
             IsValid = isValid,
             ValidationOnlyFields = new List<string>() { "g-recaptcha-response" }
          };
          context.OutputParameters["msdynmkt_validationresponse"] = Serialize(resp);
        }
        catch (Exception e)
        {
           tracingService.Trace($"{e.Message}");
        }
    }
    

    Nejprve je definována adresa URL a poté je vytvořena instance HttpClient. Vytvoří se objekt FormUrlEncodedContent obsahující recaptchaToken získaný v předchozích krocích a tajný kód poskytnutý společností Google. Poté se odešle požadavek POST a zkontroluje se stavový kód, pokud není úspěšný, vrátí se. Pokud je úspěšný, deserializuje odpověď s použitím pomocné metody Deserializovat a paramteru GRecaptchaResponse, který je definován později. Poté vytvoří nový objekt ValidateFormSubmissionResponse, serializuje jej a nastaví jako hodnotu výstupního parametru msdynmkt_validationresponse, což je jedna služba společnosti Microsoft, kterou používá k přijetí nebo odmítnutí odeslání. Přidáním řetězce g-recaptcha-response do seznamu ValidationOnlyFields skryjete toto pole před odesláním formuláře v uživatelském rozhraní.

  7. Přidejte následující kód k definování pomocných metod Serializace a Deserializace.

    private T Deserialize<T>(string jsonString)
    {
       serializer = new DataContractJsonSerializer(typeof(T));
       T result;
       using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
       {
          result = (T)serializer.ReadObject(stream);
       }
       return result;
    }
    
    private string Serialize<T>(T obj)
    {
        string result;
        serializer = new DataContractJsonSerializer(typeof(T));
        using (MemoryStream memoryStream = new MemoryStream())
        {
           serializer.WriteObject(memoryStream, obj);
           result = Encoding.Default.GetString(memoryStream.ToArray());
        }
        return result;
    }
    
  8. Přidejte následující kód k definování tříd potřebných k serializaci/deserializaci objektů řetězců JSON.

    public class FormSubmissionRequest
     {
         public Dictionary<string, string> Fields { get; set; }
     }
    
     public class GRecaptchaResponse
     {
         public bool success { get; set; }
     }
    
     public class ValidateFormSubmissionResponse
     {
         public bool IsValid { get; set; }
         public List<string> ValidationOnlyFields { get; set; }
     }
    

3.3 Podepsání a vytvořebí modulu plug-in

  1. Klikněte pravým tlačítkem na projekt a vyberte Vlastnosti v Průzkumníku řešení.
  2. Vyberte kartu Podpis a zaškrtněte políčko Podepsat sestavení.
  3. Vyberte možnost <New...>.
  4. Zadejte název souboru klíče a zrušte výběr Chránit heslem můj soubor klíče.
  5. Sestavte projekt.
  6. Sestavení modulu plug-in CustomValidationPlugin.dll najdete v umístění \bin\Debug.

3.4 Registrace modulu plug-in

  1. Otevře záznam typu PluginRegistration.exe.
  2. Vyberte Vytvořit nové připojení.
  3. Zvolte Office 365.
  4. Vyberte volbu Přihlásit se.
  5. Vyberte Registrovat a poté Registrovat nové sestavení.

    Vyberte Registrovat a poté Registrovat nové sestavení.

  6. V kroku 1 vyberte tlačítko (...) a vyberte knihovnu dll vytvořenou v předchozích krocích.
  7. Vyberte Registrovat vybrané moduly plug-in.

3.4 Krok registrace

  1. Ze seznamu registrovaných sestavení vyberte CustomValidationPlugin.
  2. Vyberte Registrovat nový krok.
  3. Do textového pole zprávy zadejte msdynmkt_validateformsubmission.
  4. Ujistěte se, že Režim provádění je nastaven jako Synchronní.

    Ujistěte se, že Režim provádění je nastaven jako Synchronní.

  5. Ujistěte se, že je Prováděcí příkaz nastaven na 10.
  6. Ujistěte se, že Fáze profilace události provádění je nastavena jako Po operaci.
  7. Vyberte Registrovat nový krok.

Závěr

Po odeslání formuláře s atributem data-validate-submission se spustí váš vlastní modul plug-in a ověří odpověď reCAPTCHA pomocí služeb Google. Vlastní modul plug-in se spustí po výchozím ověřovacím modulu plug-in společnosti Microsoft. Pokud ve formuláři nejsou žádná pole captcha společnosti Microsoft, modul plug-in společnosti Microsoft nastaví IsValid:false a odeslání se nezdaří, pokud jej nepřepíšete pomocí IsValid:true.

Tok ověření.