{"id":2397,"date":"2025-05-01T12:17:54","date_gmt":"2025-05-01T10:17:54","guid":{"rendered":"https:\/\/masero.nl\/?p=2397"},"modified":"2025-11-27T11:30:47","modified_gmt":"2025-11-27T10:30:47","slug":"een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3","status":"publish","type":"post","link":"https:\/\/masero.nl\/en\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/","title":{"rendered":"Building a Codeless Connector Platform (CCP) data connector: part 3"},"content":{"rendered":"<p><strong>In deze blogserie laat ik je zien hoe je je eigen Sentinel Codeless Connector Platform (CCP) data-connector kunt maken. Als dit je startpunt is, raad ik je aan eerst de vorige delen te lezen, want deze blog is best pittig als standalone.<\/strong><\/p>\n<p><a href=\"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-1\/\">Een Codeless Connector Platform data-connector bouwen: deel 1<\/a><\/p>\n<p><a href=\"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-2\/\">Een Codeless Connector Platform data-connector bouwen: deel 2<\/a><\/p>\n<p>Het Codeless Connector Platform is best een complex product, dus we hebben meerdere blogs nodig om alles goed uit te leggen. Maar ik beloof je: deze blog bevat waar je echt op zat te wachten. We gaan namelijk de daadwerkelijke API-aanroep &#8220;programmeren&#8221; die Sentinel zal uitvoeren. Laten we beginnen!<\/p>\n<figure id=\"attachment_2399\" aria-describedby=\"caption-attachment-2399\" style=\"width: 417px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2399\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/7jrd8c7c.png\" alt=\"GUI\" width=\"417\" height=\"371\" srcset=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/7jrd8c7c.png 417w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/7jrd8c7c-300x267.png 300w\" sizes=\"auto, (max-width: 417px) 100vw, 417px\" \/><figcaption id=\"caption-attachment-2399\" class=\"wp-caption-text\">Op naar de juiste lijnen in je GUI!<\/figcaption><\/figure>\n<h2><\/h2>\n<h3>Even opfrissen<\/h3>\n<p>De vorige keer zijn we ge\u00ebindigd met het bouwen van de GUI voor de connector. Deze GUI stelde de gebruiker in staat om twee waarden in te voeren (een base URL en een API key) die we nodig hebben om de API-calls richting 1Password uit te voeren. Die GUI hebben we gebouwd met behulp van het dataConnectorDefinition-bestand. Vandaag bouwen we het dataConnectorPoller-bestand.<\/p>\n<p>&nbsp;<\/p>\n<h3>Het dataConnectorPoller-bestand: API&#8217;s aanroepen<\/h3>\n<p>Het dataConnectorPoller-bestand bestaat uit een of meerdere &#8220;pollingConfig&#8221;-objecten. Zo&#8217;n object is in feite een eenvoudige beschrijving van een API. Door de API te beschrijven met verschillende properties, weet Sentinel wat voor soort call er gedaan moet worden, hoe er geauthenticeerd moet worden, hoe het antwoord ge\u00efnterpreteerd moet worden en hoe er omgegaan moet worden met paginering.<\/p>\n<p>Een pollingConfig bestaat uit vier onderdelen: Authentication, Request, Paging en Response. Alleen Authentication en Request zijn verplicht, maar voor de 1Password-connector gebruiken we ze alle vier.<\/p>\n<figure id=\"attachment_2401\" aria-describedby=\"caption-attachment-2401\" style=\"width: 152px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2401\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/z74ol8mt.png\" alt=\"Polling\" width=\"152\" height=\"117\" \/><figcaption id=\"caption-attachment-2401\" class=\"wp-caption-text\">Een kale polling configuratie<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<h3>Authentication<\/h3>\n<p>We beginnen met de authenticatie. Gelukkig is die bij 1Password vrij simpel: we hebben een Authorization-header nodig met de waarde &#8220;Bearer <em>&lt;token&gt;<\/em>&#8220;. De onderstaande config regelt dat:<\/p>\n<footer class=\"blockquote-footer\">&#8220;auth&#8221;: { &#8220;type&#8221;: &#8220;APIKey&#8221;, &#8220;ApiKey&#8221;: &#8220;{{ApiKey}}&#8221;, &#8220;ApiKeyName&#8221;: &#8220;Authorization&#8221;, &#8220;ApiKeyIdentifier&#8221;: &#8220;Bearer&#8221; },<\/footer>\n<p data-pm-slice=\"1 1 []\">Door het maken van een auth-blok zorg je ervoor dat de CCP probeert te authentiseren met onze API. Er zijn ook andere opties beschikbaar, zoals basic (gebruikersnaam en wachtwoord) of OAuth. Deze stel je in via de property type. Elke type vereist andere eigenschappen, dus als je hiermee wilt experimenteren, check dan zeker even de <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/templates\/microsoft.securityinsights\/dataconnectors?pivots=deployment-language-arm-template#ccpauthconfig-objects-1\">Microsoft-documentatie<\/a>. In ons geval gebruiken we &#8220;APIKey&#8221;, waardoor CCP de sleutel als header meestuurt. De overige eigenschappen bepalen hoe die header eruitziet.<\/p>\n<ul>\n<li>Weet je nog dat we in de GUI een tekstveld hebben gemaakt met de naam &#8220;ApiKey&#8221;? Hier komt de magie: door onze ApiKey in te stellen als &#8220;{{ApiKey}}&#8221; geven we het CCP-engine aan dat deze placeholder (herkenbaar aan de accolades) moet worden ingevuld op het moment dat de gebruiker op &#8220;connect&#8221; klikt, met de API key die hij of zij dan invoert.<\/li>\n<li>De naam van de header kun je instellen via de property &#8220;ApiKeyName&#8221;. Door die op &#8220;Authorization&#8221; te zetten krijgen we dus een header als &#8220;Authorization&#8221;: &#8220;&#8221;.<\/li>\n<li>Tot slot kunnen we met &#8220;ApiKeyIdentifier&#8221; een prefix toevoegen aan het token. Door deze op &#8220;Bearer&#8221; te zetten (de spatie wordt automatisch toegevoegd) krijgt de header de vorm &#8220;Authorization: Bearer <em>&lt;token&gt;<\/em>&#8220;.<\/li>\n<\/ul>\n<h3>Request<\/h3>\n<p>In dit gedeelte defini\u00ebren we de eigenschappen van de API-aanroep en onderstaande codeblock laat precies zien aan de CCP wat er nodig is.<\/p>\n<footer class=\"blockquote-footer\">&#8220;request&#8221;: { &#8220;apiEndpoint&#8221;: &#8220;{{BaseUrl}}\/api\/v1\/signinattempts&#8221;, &#8220;httpMethod&#8221;: &#8220;Post&#8221;, &#8220;queryWindowInMin&#8221;: 5, &#8220;queryTimeFormat&#8221;: &#8220;yyyy-MM-ddTHH:mm:ssZ&#8221;, &#8220;rateLimitQps&#8221;: 1, &#8220;retryCount&#8221;: 3, &#8220;timeoutInSeconds&#8221;: 60, &#8220;headers&#8221;: { &#8220;Content-Type&#8221;: &#8220;application\/json&#8221; }, &#8220;queryParametersTemplate&#8221;: &#8220;{&#8220;limit&#8221;: 1000, &#8220;start_time&#8221;: &#8220;{_QueryWindowStartTime}&#8221;, &#8220;end_time&#8221;: &#8220;{_QueryWindowEndTime}&#8221; }&#8221;, &#8220;isPostPayloadJson&#8221;: true },<\/footer>\n<p>Belangrijke punten:<\/p>\n<ul>\n<li><strong>apiEndpoint<\/strong> gebruikt de baseUrl van de gebruiker, net als de API key.<\/li>\n<li><strong>httpMethod<\/strong> is in dit geval POST.<\/li>\n<li><strong>queryWindowInMin<\/strong> bepaalt de tijdspanne per API-aanroep (hier: 5 minuten).<\/li>\n<li><strong>queryTimeFormat<\/strong> moet overeenkomen met wat de API verwacht.<\/li>\n<li><strong>rateLimitQps<\/strong> geeft aan hoeveel queries per seconde toegastaan zijn.<\/li>\n<li><strong>retryCount<\/strong> bepaalt het aantal keer dat Sentinel een verzoek zal proberen.<\/li>\n<li><strong>timeoutInSeconds<\/strong> geeft aan na hoeveel tijd een verzoek verloopt.<\/li>\n<li><strong>headers<\/strong> bevat de content-type, in dit geval \u201cContent-Type: application\/json\u201d.<\/li>\n<li><strong>queryParametersTemplate<\/strong> specificeert de payload, inclusief start- en eindtijd (in dit geval <em class=\"po\">{_QueryWindowStartTime}<\/em>\u00a0and\u00a0<em class=\"po\">{_QueryWindowEndTime}<\/em>.<\/li>\n<\/ul>\n<p>Samenvattend: bovenstaande codeblock zorgt ervoor dat er elke 5 minuten een POST-verzoek wordt gedaan naar <em>&lt;baseurl&gt;\/api\/v1\/signinattempts\u00a0<\/em>om de aanmeldingsgebeurtenissen van 1Password op te halen. De CCP voert dit verzoek uit met een limiet van 1 verzoek per seconde. Als er een fout optreedt, probeert de API het nog 3 keer opnieuw. Na 60 seconden zonder antwoord verloopt het verzoek. Via de waarde van <em>queryParametersTemplate\u00a0<\/em>is ingesteld dat per verzoek maximaal 1000 records worden opgehaald.<\/p>\n<p>&#8220;Maar hoe halen we de resterende records op als er meer dan 1000 zijn?&#8221; Fijn dat je het vraagt!<\/p>\n<p>&nbsp;<\/p>\n<h3>Paginering<\/h3>\n<p class=\"\" data-start=\"74\" data-end=\"556\">Paginering is eigenlijk heel logisch. Stel je voor dat je een boek vol kennis wilt afdrukken: dat is een enorme hoeveelheid informatie! Kun je redelijkerwijs verwachten dat iemand al die kennis in \u00e9\u00e9n keer verwerkt? Natuurlijk niet. Dus verdeel je het in behapbare stukken: een pagina. Je hebt dan nog steeds dezelfde hoeveelheid kennis (het volledige boek), maar gebruikers kunnen die informatie op hun eigen tempo verwerken, pagina voor pagina.<\/p>\n<p class=\"\" data-start=\"558\" data-end=\"868\">Paginering, oftewel pagination, werkt precies hetzelfde: in plaats van te werken met gigantische hoeveelheden data in \u00e9\u00e9n keer, knippen we die op in kleinere, beter hanteerbare stukken. De meeste moderne API\u2019s ondersteunen paginering, dus je zult dit vaak tegenkomen wanneer je systemen en applicaties koppelt.<\/p>\n<p class=\"\" data-start=\"870\" data-end=\"1162\">Sentinel\u2019s CCP ondersteunt verschillende vormen van paginering maar voor 1Password gebruiken we de variant genaamd <em data-start=\"986\" data-end=\"1001\">NextPageToken<\/em>. De onderstaande code bevat opnieuw de magie. En als geheugensteuntje heb ik ook het PowerShell-fragment uit deel 1 toegevoegd waarin we paginering behandelden.<\/p>\n<footer class=\"blockquote-footer\">&#8220;paging&#8221;: { &#8220;pagingType&#8221;: &#8220;NextPageToken&#8221;, &#8220;nextPageParaName&#8221;: &#8220;cursor&#8221;, &#8220;nextPageTokenJsonPath&#8221;: &#8220;$.cursor&#8221;, &#8220;hasNextFlagJsonPath&#8221;: &#8220;$.has_more&#8221; },\u00a0<\/footer>\n<figure id=\"attachment_2402\" aria-describedby=\"caption-attachment-2402\" style=\"width: 547px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2402\" src=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/ea46cs0q.png\" alt=\"Cursor responses\" width=\"547\" height=\"117\" srcset=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/ea46cs0q.png 547w, https:\/\/masero.nl\/wp-content\/uploads\/2025\/05\/ea46cs0q-300x64.png 300w\" sizes=\"auto, (max-width: 547px) 100vw, 547px\" \/><figcaption id=\"caption-attachment-2402\" class=\"wp-caption-text\">Terugblik naar deel 1<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<ul data-start=\"129\" data-end=\"1100\">\n<li class=\"\" data-start=\"129\" data-end=\"424\">\n<p class=\"\" data-start=\"131\" data-end=\"424\"><strong data-start=\"131\" data-end=\"145\">pagingType<\/strong>: Het type paginering dat we willen gebruiken. Andere mogelijke opties zijn bijvoorbeeld <code data-start=\"234\" data-end=\"247\">LinkHeaders<\/code>, <code data-start=\"249\" data-end=\"262\">NextPageUrl<\/code> of <code data-start=\"266\" data-end=\"274\">Offset<\/code>. Net als bij het authenticatieobject bepalen de andere eigenschappen van dit object welke velden je moet instellen, afhankelijk van het gekozen type.<\/p>\n<\/li>\n<li class=\"\" data-start=\"428\" data-end=\"693\">\n<p class=\"\" data-start=\"430\" data-end=\"693\"><strong data-start=\"430\" data-end=\"450\">nextPageParaName<\/strong>: Bij paginering op basis van <code data-start=\"480\" data-end=\"495\">NextPageToken<\/code> moet elk volgend verzoek de nieuwe NextPageToken uit de vorige response bevatten. Omdat de 1Password API verwacht dat dit wordt meegegeven als <code data-start=\"639\" data-end=\"664\">\"cursor\": &lt;cursor info&gt;<\/code>, gebruiken we hier <code data-start=\"684\" data-end=\"692\">cursor<\/code>.<\/p>\n<\/li>\n<li class=\"\" data-start=\"695\" data-end=\"888\">\n<p class=\"\" data-start=\"697\" data-end=\"888\"><strong data-start=\"697\" data-end=\"722\">nextPageTokenJsonPath<\/strong>: Het pad naar de token in de JSON-response. <code data-start=\"767\" data-end=\"770\">$<\/code> staat voor de root van de API-response. Bij 1Password zit de cursor in <code data-start=\"842\" data-end=\"858\">content.cursor<\/code>, dus gebruiken we <code data-start=\"877\" data-end=\"887\">$.cursor<\/code>.<\/p>\n<\/li>\n<li class=\"\" data-start=\"890\" data-end=\"1100\">\n<p class=\"\" data-start=\"892\" data-end=\"1100\"><strong data-start=\"892\" data-end=\"915\">hasNextFlagJsonPath<\/strong>: Het pad naar de boolean die aangeeft of er nog meer items zijn of dat het tijdsvenster volledig is doorlopen. Voor 1Password is dit het <code data-start=\"1053\" data-end=\"1063\">has_more<\/code>-veld, dus gebruiken we <code data-start=\"1087\" data-end=\"1099\">$.has_more<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p class=\"\" data-start=\"1102\" data-end=\"1230\">Met bovenstaande instellingen zou de CCP soepel door de verschillende pagina\u2019s van de 1Password-response moeten kunnen bladeren.<\/p>\n<p class=\"\" data-start=\"1232\" data-end=\"1306\">\u201cMaar hoe verwerken we de response eigenlijk?\u201d Fijn dat je het vraagt!<\/p>\n<p>&nbsp;<\/p>\n<h2>Response<\/h2>\n<p>Dit deel is eenvoudig. De logs staan in het &#8220;items&#8221;-veld van de response, dus:<\/p>\n<footer class=\"blockquote-footer\">&#8220;response&#8221;: { &#8220;format&#8221;: &#8220;json&#8221;, &#8220;eventsJsonPaths&#8221;: [ &#8220;$.items&#8221; ] },<\/footer>\n<p>Yep, zo simpel is het. Het formaat is json en het pad naar de events is gewoon\u00a0<em>items.<\/em> Makkie!<\/p>\n<p>Nu moet ik wel bekennen: eerder zei ik dat het dataConnectorPoller bestand alleen uit de vier besproken onderdelen zou bestaan &#8211; dat klopt niet helemaal. Omdat we werken met versie 2 van het CCP, moeten we nog drie extra zaken toevoegen: we moeten onze poller koppelen aan het dataConnectorDefiniton bestand (uit deel 2), we moeten het\u00a0<em>dataType<\/em> opgeven dat deze poller ophaalt (ook uit deel 2) en we moeten aangeven welke Data Collection Rule (DCR) deze poller gebruikt (komt in deel 4). De code hiervoor ziet er uit als volgt:<\/p>\n<footer class=\"blockquote-footer\">&#8220;connectorDefinitionName&#8221;: &#8220;1PasswordCCP&#8221;, &#8220;dataType&#8221;: &#8220;OnePasswordSignInEvents_CL&#8221;, &#8220;dcrConfig&#8221;: { &#8220;streamName&#8221;: &#8220;Custom-OnePasswordEvents&#8221;, &#8220;dataCollectionEndpoint&#8221;: &#8220;{{dataCollectionEndpoint}}&#8221;, &#8220;dataCollectionRuleImmutableId&#8221;: &#8220;{{dataCollectionRuleImmutableId}}&#8221; },<\/footer>\n<ul>\n<li><strong>connectorDefinitionName<\/strong> moet overeenkomen met de id uit het connectorDefinition-bestand.<\/li>\n<li><strong>dataType<\/strong> is een van de types uit het dataTypes-blok in datzelfde bestand.<\/li>\n<li><strong>dcrConfig<\/strong> bevat koppelingen naar je DCR (komt in deel 4).<\/li>\n<\/ul>\n<p>Hoewel dit gedeelte van de sjabloon eenvoudiger is dan de voorgaande, is het belangrijk om het zorgvuldig te behandelen. Dit deel vormt namelijk de koppeling tussen het bestand <code data-start=\"256\" data-end=\"286\">dataConnectorDefinition.json<\/code> en het bestand <code data-start=\"302\" data-end=\"328\">dataConnectorPoller.json<\/code>, evenals de koppeling tussen het bestand <code data-start=\"370\" data-end=\"396\">dataConnectorPoller.json<\/code> en het bestand <code data-start=\"412\" data-end=\"422\">dcr.json<\/code>. Als er tijdens het verpakken fouten optreden die wijzen op ontbrekende koppelingen, is dit het gedeelte om te controleren!<\/p>\n<p>&nbsp;<\/p>\n<h2>Samenvattend<\/h2>\n<p class=\"\" data-start=\"6010\" data-end=\"6195\">We hebben veel behandeld in deze blog. Je weet nu precies hoe je het CCP kunt laten doen wat jij wilt: het gaat de API-aanroep doen die je wilt, gebaseerd op je sjabloon. Gefeliciteerd!<\/p>\n<p class=\"\" data-start=\"6197\" data-end=\"6520\">Als je wat meer uitdaging wilt, herinner je je misschien dat we in het vorige deel drie datatypes hebben gedefinieerd: <code data-start=\"6316\" data-end=\"6343\">OnePasswordAuditEvents_CL<\/code>, <code data-start=\"6345\" data-end=\"6373\">OnePasswordSignInEvents_CL<\/code> en <code data-start=\"6377\" data-end=\"6408\">OnePasswordItemUsageEvents_CL<\/code>. De bovenstaande poller zorgt voor het ophalen van de <code data-start=\"6463\" data-end=\"6477\">SignInEvents<\/code>. Kun jij de resterende twee pollers maken?<\/p>\n<p class=\"\" data-start=\"6522\" data-end=\"6685\">Zoals altijd kun je de code voor deze blog <a href=\"https:\/\/github.com\/timtim589\/CCP_Demo\/blob\/main\/MediumDemo\/Data%20Connectors\/1Password_CCP\/PollingConfig.json\">hier op GitHub<\/a> vinden (Spoiler alert: het bevat de resterende twee pollers, dus als je wilt oefenen, doe dat dan eerst).<\/p>\n<p class=\"\" data-start=\"6687\" data-end=\"7071\">We zijn er nog niet helemaal. Je hebt nu twee ongelooflijk ingewikkelde ARM-sjablonen die je nog steeds niet kunt implementeren. Gelukkig naderen we het einde van de tunnel. In de volgende aflevering zal ik kort de DCR- en tabelsjablonen behandelen, waarna we direct overgaan tot het daadwerkelijk verpakken en implementeren van je connector, zodat je deze &#8220;in het wild&#8221; kunt ervaren.<\/p>\n<p>Bedankt voor het lezen van het derde deel van deze serie blogs. In de vierde en laatste blog gaan we alle losse eindjes aan elkaar verbinden. Na het lezen van alle vier de blogs beschik je gegarandeerd over alle benodigde kennis voor het deployen van je eigen CCP-connector en het laten draaien hiervan in je Sentinel-werkruimte.<\/p>\n<p>&nbsp;<\/p>\n<p>Klik hier om verder te lezen: <a href=\"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-4\/\">Een Codeless Connector Platform data-connector bouwen: deel 4<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this blog series, I will show you how to create your own Sentinel Codeless Connector Platform (CCP) data connector. As<\/p>","protected":false},"author":5,"featured_media":2179,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2397","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Een Codeless Connector Platform data-connector bouwen: deel 3<\/title>\n<meta name=\"description\" content=\"In deze blogserie laat Tim je zien hoe je je eigen Sentinel Codeless Connector Platform (CCP) connector kunt maken.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/masero.nl\/en\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Een Codeless Connector Platform data-connector bouwen: deel 3\" \/>\n<meta property=\"og:description\" content=\"In deze blogserie laat Tim je zien hoe je je eigen Sentinel Codeless Connector Platform (CCP) connector kunt maken.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/masero.nl\/en\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/\" \/>\n<meta property=\"og:site_name\" content=\"Masero\" \/>\n<meta property=\"article:published_time\" content=\"2025-05-01T10:17:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-27T10:30:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/masero.nl\/wp-content\/uploads\/2025\/03\/Sentinel.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1000\" \/>\n\t<meta property=\"og:image:height\" content=\"750\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Tim Groothuis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tim Groothuis\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\\\/\"},\"author\":{\"name\":\"Tim Groothuis\",\"@id\":\"https:\\\/\\\/masero.nl\\\/#\\\/schema\\\/person\\\/253f4280be6f54af76d51185ed3ff27d\"},\"headline\":\"Een Codeless Connector Platform (CCP) data-connector bouwen: deel 3\",\"datePublished\":\"2025-05-01T10:17:54+00:00\",\"dateModified\":\"2025-11-27T10:30:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\\\/\"},\"wordCount\":1558,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/masero.nl\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/Sentinel.png\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\\\/\",\"url\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\\\/\",\"name\":\"Een Codeless Connector Platform data-connector bouwen: deel 3\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/masero.nl\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/Sentinel.png\",\"datePublished\":\"2025-05-01T10:17:54+00:00\",\"dateModified\":\"2025-11-27T10:30:47+00:00\",\"description\":\"In deze blogserie laat Tim je zien hoe je je eigen Sentinel Codeless Connector Platform (CCP) connector kunt maken.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\\\/#primaryimage\",\"url\":\"https:\\\/\\\/masero.nl\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/Sentinel.png\",\"contentUrl\":\"https:\\\/\\\/masero.nl\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/Sentinel.png\",\"width\":1000,\"height\":750},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/masero.nl\\\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/masero.nl\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Een Codeless Connector Platform (CCP) data-connector bouwen: deel 3\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/masero.nl\\\/#website\",\"url\":\"https:\\\/\\\/masero.nl\\\/\",\"name\":\"Masero\",\"description\":\"Cyber Security\",\"publisher\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/masero.nl\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/masero.nl\\\/#organization\",\"name\":\"Masero\",\"url\":\"https:\\\/\\\/masero.nl\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/masero.nl\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/masero.nl\\\/wp-content\\\/uploads\\\/2023\\\/01\\\/cropped-MSO003-Logo-RGB.png\",\"contentUrl\":\"https:\\\/\\\/masero.nl\\\/wp-content\\\/uploads\\\/2023\\\/01\\\/cropped-MSO003-Logo-RGB.png\",\"width\":10019,\"height\":2840,\"caption\":\"Masero\"},\"image\":{\"@id\":\"https:\\\/\\\/masero.nl\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/masero.nl\\\/#\\\/schema\\\/person\\\/253f4280be6f54af76d51185ed3ff27d\",\"name\":\"Tim Groothuis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9cdeb82b5b2b55957d1df149ba5c434975c414db80cca296043bcd96c540cba6?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9cdeb82b5b2b55957d1df149ba5c434975c414db80cca296043bcd96c540cba6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9cdeb82b5b2b55957d1df149ba5c434975c414db80cca296043bcd96c540cba6?s=96&d=mm&r=g\",\"caption\":\"Tim Groothuis\"},\"url\":\"https:\\\/\\\/masero.nl\\\/en\\\/author\\\/tim\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Een Codeless Connector Platform data-connector bouwen: deel 3","description":"In deze blogserie laat Tim je zien hoe je je eigen Sentinel Codeless Connector Platform (CCP) connector kunt maken.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/masero.nl\/en\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/","og_locale":"en_GB","og_type":"article","og_title":"Een Codeless Connector Platform data-connector bouwen: deel 3","og_description":"In deze blogserie laat Tim je zien hoe je je eigen Sentinel Codeless Connector Platform (CCP) connector kunt maken.","og_url":"https:\/\/masero.nl\/en\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/","og_site_name":"Masero","article_published_time":"2025-05-01T10:17:54+00:00","article_modified_time":"2025-11-27T10:30:47+00:00","og_image":[{"width":1000,"height":750,"url":"https:\/\/masero.nl\/wp-content\/uploads\/2025\/03\/Sentinel.png","type":"image\/png"}],"author":"Tim Groothuis","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Tim Groothuis","Estimated reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/#article","isPartOf":{"@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/"},"author":{"name":"Tim Groothuis","@id":"https:\/\/masero.nl\/#\/schema\/person\/253f4280be6f54af76d51185ed3ff27d"},"headline":"Een Codeless Connector Platform (CCP) data-connector bouwen: deel 3","datePublished":"2025-05-01T10:17:54+00:00","dateModified":"2025-11-27T10:30:47+00:00","mainEntityOfPage":{"@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/"},"wordCount":1558,"commentCount":0,"publisher":{"@id":"https:\/\/masero.nl\/#organization"},"image":{"@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/#primaryimage"},"thumbnailUrl":"https:\/\/masero.nl\/wp-content\/uploads\/2025\/03\/Sentinel.png","articleSection":["Blog"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/","url":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/","name":"Een Codeless Connector Platform data-connector bouwen: deel 3","isPartOf":{"@id":"https:\/\/masero.nl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/#primaryimage"},"image":{"@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/#primaryimage"},"thumbnailUrl":"https:\/\/masero.nl\/wp-content\/uploads\/2025\/03\/Sentinel.png","datePublished":"2025-05-01T10:17:54+00:00","dateModified":"2025-11-27T10:30:47+00:00","description":"In deze blogserie laat Tim je zien hoe je je eigen Sentinel Codeless Connector Platform (CCP) connector kunt maken.","breadcrumb":{"@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/#primaryimage","url":"https:\/\/masero.nl\/wp-content\/uploads\/2025\/03\/Sentinel.png","contentUrl":"https:\/\/masero.nl\/wp-content\/uploads\/2025\/03\/Sentinel.png","width":1000,"height":750},{"@type":"BreadcrumbList","@id":"https:\/\/masero.nl\/een-codeless-connector-platform-ccp-data-connector-bouwen-deel-3\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/masero.nl\/"},{"@type":"ListItem","position":2,"name":"Een Codeless Connector Platform (CCP) data-connector bouwen: deel 3"}]},{"@type":"WebSite","@id":"https:\/\/masero.nl\/#website","url":"https:\/\/masero.nl\/","name":"Masero","description":"Cyber Security","publisher":{"@id":"https:\/\/masero.nl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/masero.nl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/masero.nl\/#organization","name":"Masero","url":"https:\/\/masero.nl\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/masero.nl\/#\/schema\/logo\/image\/","url":"https:\/\/masero.nl\/wp-content\/uploads\/2023\/01\/cropped-MSO003-Logo-RGB.png","contentUrl":"https:\/\/masero.nl\/wp-content\/uploads\/2023\/01\/cropped-MSO003-Logo-RGB.png","width":10019,"height":2840,"caption":"Masero"},"image":{"@id":"https:\/\/masero.nl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/masero.nl\/#\/schema\/person\/253f4280be6f54af76d51185ed3ff27d","name":"Tim Groothuis","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/9cdeb82b5b2b55957d1df149ba5c434975c414db80cca296043bcd96c540cba6?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/9cdeb82b5b2b55957d1df149ba5c434975c414db80cca296043bcd96c540cba6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9cdeb82b5b2b55957d1df149ba5c434975c414db80cca296043bcd96c540cba6?s=96&d=mm&r=g","caption":"Tim Groothuis"},"url":"https:\/\/masero.nl\/en\/author\/tim\/"}]}},"_links":{"self":[{"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/posts\/2397","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/comments?post=2397"}],"version-history":[{"count":8,"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/posts\/2397\/revisions"}],"predecessor-version":[{"id":3286,"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/posts\/2397\/revisions\/3286"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/media\/2179"}],"wp:attachment":[{"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/media?parent=2397"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/categories?post=2397"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/masero.nl\/en\/wp-json\/wp\/v2\/tags?post=2397"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}