Dijeli putem


Integracija prilagođenog captcha servisa s Customer Insights - Journeys obrascima

Customer Insights - Journeys Obrasci vam omogućuju korištenje prilagođene Captcha Bot zaštite za provjeru valjanosti slanja obrazaca. Ovaj članak daje primjer kako integrirati Google reCAPTCHA. Protok je sličan za ostale captcha usluge.

Napomena

U trenutnoj verziji aplikacije može biti aktivna samo jedna implementacija captcha. Ako koristite vlastitog davatelja captcha usluga (kao što je navedeno u nastavku), postojeći obrasci koji koriste gotovu captcha prestat će raditi. Prilagođena implementacija captcha zahtijeva barem osnovno znanje o pisanju i ispravljanju pogrešaka dodataka za dataverse.

Postupak se sastoji od sljedećih koraka:

  1. Dodajte reCAPTCHA u obrazac.
  2. Dodajte tekstnu vrijednost captcha u slanje obrasca nakon slanja obrasca.
  3. Stvorite dodatak u CRM-u koji provjerava valjanost captcha.

Detaljni primjer: integrirajte Google reCAPTCHA

1. Dodajte reCAPTCHA u obrazac

  1. Stvorite obrazac u Customer Insights - Journeys uređivač obrazaca.

  2. Elementu data-validate-submission="true" <form> dodajte atribut koji omogućuje prilagođenu provjeru valjanosti prilikom slanja obrasca:

    Dodajte atribut elementu obrasca.

  3. <div id="g-recaptcha"> Dodajte u obrazac kao rezervirano mjesto za reCAPTCHA. Ovaj div ID koristi se kao referenca kasnije. Preporučuje se da rezervirano mjesto stavite između posljednjeg polja i gumba za slanje.

    Dodajte rezervirano mjesto za reCAPTCHA.

  4. Objavite obrazac i ugradite obrazac na svoje web-mjesto.

  5. Uredite stranicu na koju je obrazac uložen. Dodajte skriptu koju pruža Google u zaglavlje stranice. Ova skripta učitava reCAPTCHA s parametrom povratnog onLoad poziva. Ovaj povratni poziv poziva se čim se captcha učita.

    <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback" async defer></script>
    
  6. Dodajte funkciju onLoadCallback:

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

    Zamijenite rezervirano {sitekey} mjesto onim koje pruža Google. Ova funkcija povratnog poziva prikazuje reCAPTCHA unutar rezerviranog mjesta <div id="g-recaptcha"> koje ste ranije stvorili.

  7. Registrirajte funkciju onloadCallback koju će pozvati učitavač obrazaca:

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

2. Dodajte tekstnu vrijednost captcha u slanje obrasca

Nakon slanja obrasca parametar g-recaptcha-response se automatski dodaje u slanje obrasca. U sljedećim koracima izradit ćete dodatak koji skriva tu vrijednost jer će se dodati ValidationOnlyFields na popis u objektu odgovora koji vraća kôd dodatka.

Dodan je parametar G-recaptcha-response.

3. Stvorite dodatak

3.1 Stvaranje Visual Studio projekta za dodatak

  1. Otvorite Visual Studio i stvorite novi projekt biblioteke predmeta pomoću platforme .NET Framework 4.6.2.
  2. U eksploreru za rješenja odaberite Upravljanje paketima NuGet i instalacija Microsoft.CrmSdk.CoreAssemblies.

3.2 Stvorite klasu dodataka

  1. Preimenuj Class1.cs u CustomValidationPlugin.cs.

  2. Neka klasa CustomValidationPlugin naslijedi iz IPlugin sučelja i doda metodu izvršavanja.

    public class CustomValidationPlugin : IPlugin
    {
       public void Execute(IServiceProvider serviceProvider)
       {
    
       }
    }
    
  3. Dodajte sljedeći kôd u metodu izvršavanja da biste dohvatili kontekst i uslugu praćenja.

    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. Dodajte ovaj kod da biste dohvatili niz parametara slanja obrasca. To je JSON kodirani niz koji predstavlja polja koja je korisnik poslao u obrascu. Ovaj proces dohvaća ovaj niz i deserijalizira ga pomoću metode Deserijaliziraj pomagača i klase FormSubmissionRequest koja je kasnije definirana. Time se provjerava sadrži li polje Polja ključ za g-recaptcha-response. Ako reCAPTCHA ključ nije pronađen, vraća preskakanje provjere valjanosti jer obrazac koji obrađuje nije sadržavao Googleov element 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. Dodajte sljedeći kôd da biste ga vratili ako g-recaptcha-token je vrijednost null ili prazna.

    if (String.IsNullOrEmpty(recaptchaToken))
    {
       tracingService.Trace($"g-recaptcha-response value not found");
       return;
    }
    
  6. Dodajte sljedeći kôd da biste potvrdili Google captcha token u odnosu na Google API-je.

    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}");
        }
    }
    

    Prvo se definira URL, a zatim se stvara instanca HttpClient . Stvara FormUrlEncodedContent se objekt koji sadrži dohvaćeno recaptchaToken u prethodnim koracima i tajni ključ koji pruža Google. POST Zatim se šalje zahtjev i provjerava se kod statusa, ako ne uspije, vraća se. Ako uspije, deserijalizira odgovor metodom Deserijaliziraj pomagača i GRecaptchaResponse to se definira kasnije. Zatim stvara novi ValidateFormSubmissionResponse objekt, serijalizira ga i postavlja kao vrijednost izlaznog parametra msdynmkt_validationresponse, koji je jedini Microsoftov servis koji koristi za prihvaćanje ili odbijanje slanja. Dodavanje g-recaptcha-response niza na ValidationOnlyFields popis skriva ovo polje od slanja obrasca u korisničkom sučelju.

  7. Dodajte sljedeći kod da biste definirali metode pomoći serijalizacije i deserijalizacije.

    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. Dodajte sljedeći kod da biste definirali klase potrebne za serijalizaciju/deserijalizaciju JSON nizova objekata.

    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 Potpišite i izradite dodatak

  1. Desnom tipkom miša kliknite projekt, a zatim u eksploreru za rješenja odaberite Svojstva.
  2. Odaberite karticu Potpisivanje i potvrdite okvir Potpiši sklop .
  3. Odaberite <New...>.
  4. Unesite naziv datoteke ključa i poništite odabir Zaštiti moju datoteku ključa lozinkom.
  5. Izgradite projekt.
  6. Sklop CustomValidationPlugin.dll dodataka možete pronaći u \bin\Debug.

3.4 Dodatak za registraciju

  1. Otvoren PluginRegistration.exe.
  2. Odaberite Stvori novu vezu.
  3. Izabrati Office 365.
  4. Odaberite Prijava.
  5. Odaberite Registriraj , a zatim Registriraj novi sklop.

    Odaberite Registriraj, a zatim Registriraj novi sklop.

  6. Odaberite ( ...) u koraku 1 i odaberite dll ugrađen u prethodnim koracima.
  7. Odaberite Registriraj odabrani dodatak.

3.4 Korak registracije

  1. Odaberite CustomValidationPlugin s popisa registriranih sklopova.
  2. Odaberite Registriraj novi korak.
  3. Unesite msdynmkt_validateformsubmission u tekstualno polje Poruka.
  4. Provjerite je li način izvršavanja postavljen kao Sinkron.

    Provjerite je li način izvršavanja postavljen kao Sinkronozan.

  5. Provjerite je li redoslijed izvršavanja postavljen na 10.
  6. Provjerite je li faza izvršavanja kanala događaja postavljena kao Post Operation.
  7. Odaberite Registriraj novi korak.

Zaključak

Kada se pošalje obrazac s atributom data-validate-submission , pokreće se vaš prilagođeni dodatak i potvrđuje odgovor reCAPTCHA Googleovim uslugama. Prilagođeni dodatak pokrenut će se nakon zadanog Microsoftova dodatka za provjeru valjanosti. Ako u obrascu nema Microsoftovih captcha polja, Microsoftov dodatak se postavlja IsValid:false i slanje ne uspijeva ako ga IsValid:true ne prebrišete.

Tijek provjere valjanosti.