<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Technology - Inero Software - Software Consulting</title>
	<atom:link href="https://inero-software.com/category/blog/technology/feed/" rel="self" type="application/rss+xml" />
	<link>https://inero-software.com/category/blog/technology/</link>
	<description>We unleash innovations using cutting-edge technologies, modern design and AI</description>
	<lastBuildDate>Mon, 29 Dec 2025 10:18:26 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://inero-software.com/wp-content/uploads/2018/11/inero-logo-favicon.png</url>
	<title>Technology - Inero Software - Software Consulting</title>
	<link>https://inero-software.com/category/blog/technology/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">153509928</site>	<item>
		<title>Keycloak Deployment Auditing – General Scope and Guidelines</title>
		<link>https://inero-software.com/keycloak-deployment-auditing-general-scope-and-guidelines/</link>
		
		<dc:creator><![CDATA[Andrzej Chybicki]]></dc:creator>
		<pubDate>Mon, 29 Dec 2025 10:08:56 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Keycloak]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[authorization server audit]]></category>
		<category><![CDATA[client-side OAuth security]]></category>
		<category><![CDATA[dentity and access management audit]]></category>
		<category><![CDATA[enterprise Keycloak deployment]]></category>
		<category><![CDATA[Keycloak audit best practices]]></category>
		<category><![CDATA[Keycloak client configuration]]></category>
		<category><![CDATA[Keycloak deployment auditing]]></category>
		<category><![CDATA[Keycloak IAM audit]]></category>
		<category><![CDATA[Keycloak security audit]]></category>
		<category><![CDATA[token validation best practices]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=8306</guid>

					<description><![CDATA[<p>Keycloak Deployment Auditing – General Scope and Guidelines Practical lessons from auditing multi-realm, multi-client Keycloak environments in medium and large organizations  1. Introduction In medium and large enterprises, Keycloak deployments rarely follow a simple “one realm – one application” pattern. In reality, such environments typically consist of multiple realms reflecting&#8230;</p>
<p>Artykuł <a href="https://inero-software.com/keycloak-deployment-auditing-general-scope-and-guidelines/">Keycloak Deployment Auditing – General Scope and Guidelines</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="8306" class="elementor elementor-8306" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-2f79978 e-flex e-con-boxed e-con e-parent" data-id="2f79978" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-d183de2 e-con-full e-flex e-con e-child" data-id="d183de2" data-element_type="container">
				</div>
		<div class="elementor-element elementor-element-b58a909 e-con-full e-flex e-con e-child" data-id="b58a909" data-element_type="container">
				<div class="elementor-element elementor-element-1e33c8a elementor-widget elementor-widget-text-editor" data-id="1e33c8a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h1>Keycloak Deployment Auditing – General Scope and Guidelines</h1><blockquote><h5 style="text-align: center;">Practical lessons from auditing multi-realm, multi-client Keycloak environments in medium and large organizations</h5></blockquote>						</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-c9cf0b5 e-con-full e-flex e-con e-child" data-id="c9cf0b5" data-element_type="container">
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-5ee1ead e-flex e-con-boxed e-con e-parent" data-id="5ee1ead" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-99d9ce5 elementor-widget elementor-widget-spacer" data-id="99d9ce5" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-0de96d9 e-flex e-con-boxed e-con e-parent" data-id="0de96d9" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-ecdd67e e-con-full e-flex e-con e-child" data-id="ecdd67e" data-element_type="container">
				</div>
		<div class="elementor-element elementor-element-1fed69f e-con-full e-flex e-con e-child" data-id="1fed69f" data-element_type="container">
				<div class="elementor-element elementor-element-c07326c elementor-widget elementor-widget-text-editor" data-id="c07326c" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2> 1. Introduction</h2><p class="MsoNormal"><span lang="EN-US">In medium and large enterprises, Keycloak deployments rarely follow a simple “one realm – one application” pattern. In reality, such environments typically consist of multiple realms reflecting organizational structures, environments, or business domains, alongside dozens or even hundreds of client applications.</span></p><p class="MsoNormal"><span lang="EN-US"> </span></p><p class="MsoNormal"><span lang="EN-US">These clients often include web frontends, backend services, machine-to-machine integrations, and legacy systems, all maintained by different teams with varying levels of IAM expertise. As a result, Identity and Access Management quickly becomes a shared responsibility rather than a centrally controlled component.</span></p><blockquote><p>“A Keycloak audit is not about verifying settings in the admin console — it is about understanding how identity, applications, and security decisions interact at scale.”</p></blockquote><p class="MsoNormal"><span lang="EN-US">The primary goal of a Keycloak deployment audit is therefore not to “find flaws in Keycloak itself”, but to assess whether the entire authentication and authorization ecosystem is secure, coherent, and aligned with modern OAuth 2.1 and OpenID Connect best practices.</span></p><p class="MsoNormal"><span lang="EN-US"><a href="https://inero-software.com/keycloak-migration-made-easy-tips-and-best-practices/">From our experience auditing complex enterprise IAM landscapes</a>, a comprehensive Keycloak security audit focuses on three complementary objectives:</span></p><ul><li style="list-style-type: none;"><ul><li class="MsoNormal"><span lang="EN-US">evaluating the configuration of the Keycloak Authorization Server,</span></li><li class="MsoNormal"><span lang="EN-US">reviewing how client applications integrate with Keycloak,</span></li><li class="MsoNormal"><span lang="EN-US">identifying security risks emerging from the interaction between both sides.</span></li></ul></li></ul><p class="MsoNormal"><span lang="EN-US"> </span></p><p class="MsoNormal"><span lang="EN-US">This holistic approach is essential, as many real-world security issues do not stem from a single misconfiguration, but from subtle inconsistencies across multiple realms, clients, and applications.</span></p><p class="MsoNormal"><span lang="EN-US"> </span></p><div align="center"> </div>						</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-311be98 e-con-full e-flex e-con e-child" data-id="311be98" data-element_type="container">
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-79ba960 e-flex e-con-boxed e-con e-parent" data-id="79ba960" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-e28818b e-con-full e-flex e-con e-child" data-id="e28818b" data-element_type="container">
				</div>
		<div class="elementor-element elementor-element-ad54fa6 e-con-full e-flex e-con e-child" data-id="ad54fa6" data-element_type="container">
				<div class="elementor-element elementor-element-ff385ae elementor-widget elementor-widget-text-editor" data-id="ff385ae" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p style="text-align: center;"><strong>OVERALL RISK SEVERITY (ORS) MODEL</strong></p><div align="center"><table class="MsoNormalTable" style="width: 423.1pt;" border="1" width="564" cellspacing="0" cellpadding="0"><tbody><tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; height: 12.6pt;"><td style="width: 423.1pt; background: #98afc7; padding: 5.75pt 5.4pt; height: 12.6pt; border: 1.5pt solid #cdcdcd;" colspan="5" width="564"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><b><span lang="EN-US" style="font-family: 'Calibri',sans-serif; mso-ascii-theme-font: major-latin; mso-fareast-font-family: 'Times New Roman'; mso-hansi-theme-font: major-latin; mso-bidi-theme-font: major-latin; color: black;">ORS</span></b></p></td></tr><tr style="mso-yfti-irow: 1; height: 1.0pt;"><td style="width: 85.85pt; border-right: 1.5pt solid #cdcdcd; border-bottom: 1.5pt solid #cdcdcd; border-left: 1.5pt solid #cdcdcd; border-top-width: initial; border-top-style: none; padding: 5.75pt 5.4pt; height: 1pt;" rowspan="4" width="114"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><b><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; color: black;">Impact</span></b></p></td><td style="width: 85.9pt; border-style: none solid solid none; border-bottom-color: #cdcdcd; border-right-color: #cdcdcd; background: #98afc7; padding: 5.75pt 5.4pt; height: 1pt; border-width: initial 1.5pt 1.5pt initial;" width="115"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; color: black;">HIGH</span></p></td><td style="width: 85.9pt; border-style: none solid solid none; border-bottom-color: #cdcdcd; border-right-color: #cdcdcd; background: orange; padding: 5.75pt 5.4pt; height: 1pt; border-width: initial 1.5pt 1.5pt initial;" width="115"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><span lang="EN-US" style="font-family: 'Calibri',sans-serif; mso-ascii-theme-font: major-latin; mso-fareast-font-family: 'Times New Roman'; mso-hansi-theme-font: major-latin; mso-bidi-theme-font: major-latin; color: black;">Medium</span></p></td><td style="width: 85.9pt; border-style: none solid solid none; border-bottom-color: #cdcdcd; border-right-color: #cdcdcd; background: red; padding: 5.75pt 5.4pt; height: 1pt; border-width: initial 1.5pt 1.5pt initial;" width="115"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><span lang="EN-US" style="font-family: 'Calibri',sans-serif; mso-ascii-theme-font: major-latin; mso-fareast-font-family: 'Times New Roman'; mso-hansi-theme-font: major-latin; mso-bidi-theme-font: major-latin; color: black;">High</span></p></td><td style="width: 79.55pt; border-style: none solid solid none; border-bottom-color: #cdcdcd; border-right-color: #cdcdcd; background: pink; padding: 5.75pt 5.4pt; height: 1pt; border-width: initial 1.5pt 1.5pt initial;" width="106"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; color: black;">Critical</span></p></td></tr><tr style="mso-yfti-irow: 2; height: 9.3pt;"><td style="width: 85.9pt; border-style: none solid solid none; border-bottom-color: #cdcdcd; border-right-color: #cdcdcd; background: #98afc7; padding: 5.75pt 5.4pt; height: 9.3pt; border-width: initial 1.5pt 1.5pt initial;" width="115"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; color: black;">MEDIUM</span></p></td><td style="width: 85.9pt; border-style: none solid solid none; border-bottom-color: #cdcdcd; border-right-color: #cdcdcd; background: yellow; padding: 5.75pt 5.4pt; height: 9.3pt; border-width: initial 1.5pt 1.5pt initial;" width="115"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><span lang="EN-US" style="font-family: 'Calibri',sans-serif; mso-ascii-theme-font: major-latin; mso-fareast-font-family: 'Times New Roman'; mso-hansi-theme-font: major-latin; mso-bidi-theme-font: major-latin; color: black;">Low</span></p></td><td style="width: 85.9pt; border-style: none solid solid none; border-bottom-color: #cdcdcd; border-right-color: #cdcdcd; background: orange; padding: 5.75pt 5.4pt; height: 9.3pt; border-width: initial 1.5pt 1.5pt initial;" width="115"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><span lang="EN-US" style="font-family: 'Calibri',sans-serif; mso-ascii-theme-font: major-latin; mso-fareast-font-family: 'Times New Roman'; mso-hansi-theme-font: major-latin; mso-bidi-theme-font: major-latin; color: black;">Medium</span></p></td><td style="width: 79.55pt; border-style: none solid solid none; border-bottom-color: #cdcdcd; border-right-color: #cdcdcd; background: red; padding: 5.75pt 5.4pt; height: 9.3pt; border-width: initial 1.5pt 1.5pt initial;" width="106"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; color: black;">High</span></p></td></tr><tr style="mso-yfti-irow: 3; height: 2.1pt;"><td style="width: 85.9pt; border-style: none solid solid none; border-bottom-color: #cdcdcd; border-right-color: #cdcdcd; background: #98afc7; padding: 5.75pt 5.4pt; height: 2.1pt; border-width: initial 1.5pt 1.5pt initial;" width="115"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; color: black;">LOW</span></p></td><td style="width: 85.9pt; border-style: none solid solid none; border-bottom-color: #cdcdcd; border-right-color: #cdcdcd; background: lightgreen; padding: 5.75pt 5.4pt; height: 2.1pt; border-width: initial 1.5pt 1.5pt initial;" width="115"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><span lang="EN-US" style="font-family: 'Calibri',sans-serif; mso-ascii-theme-font: major-latin; mso-fareast-font-family: 'Times New Roman'; mso-hansi-theme-font: major-latin; mso-bidi-theme-font: major-latin; color: black;">Note</span></p></td><td style="width: 85.9pt; border-style: none solid solid none; border-bottom-color: #cdcdcd; border-right-color: #cdcdcd; background: yellow; padding: 5.75pt 5.4pt; height: 2.1pt; border-width: initial 1.5pt 1.5pt initial;" width="115"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><span lang="EN-US" style="font-family: 'Calibri',sans-serif; mso-ascii-theme-font: major-latin; mso-fareast-font-family: 'Times New Roman'; mso-hansi-theme-font: major-latin; mso-bidi-theme-font: major-latin; color: black;">Low</span></p></td><td style="width: 79.55pt; border-style: none solid solid none; border-bottom-color: #cdcdcd; border-right-color: #cdcdcd; background: orange; padding: 5.75pt 5.4pt; height: 2.1pt; border-width: initial 1.5pt 1.5pt initial;" width="106"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; color: black;">Medium</span></p></td></tr><tr style="mso-yfti-irow: 4; height: 1.0pt;"><td style="width: 85.9pt; border-style: none solid solid none; border-bottom-color: #cdcdcd; border-right-color: #cdcdcd; background: #98afc7; padding: 5.75pt 5.4pt; height: 1pt; border-width: initial 1.5pt 1.5pt initial;" width="115"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; color: black;"> </span></p></td><td style="width: 85.9pt; border-style: none solid solid none; border-bottom-color: #cdcdcd; border-right-color: #cdcdcd; background: #98afc7; padding: 5.75pt 5.4pt; height: 1pt; border-width: initial 1.5pt 1.5pt initial;" width="115"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><span lang="EN-US" style="font-family: 'Calibri',sans-serif; mso-ascii-theme-font: major-latin; mso-fareast-font-family: 'Times New Roman'; mso-hansi-theme-font: major-latin; mso-bidi-theme-font: major-latin; color: black;">LOW</span></p></td><td style="width: 85.9pt; border-style: none solid solid none; border-bottom-color: #cdcdcd; border-right-color: #cdcdcd; background: #98afc7; padding: 5.75pt 5.4pt; height: 1pt; border-width: initial 1.5pt 1.5pt initial;" width="115"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><span lang="EN-US" style="font-family: 'Calibri',sans-serif; mso-ascii-theme-font: major-latin; mso-fareast-font-family: 'Times New Roman'; mso-hansi-theme-font: major-latin; mso-bidi-theme-font: major-latin; color: black;">MEDIUM</span></p></td><td style="width: 79.55pt; border-style: none solid solid none; border-bottom-color: #cdcdcd; border-right-color: #cdcdcd; background: #98afc7; padding: 5.75pt 5.4pt; height: 1pt; border-width: initial 1.5pt 1.5pt initial;" width="106"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; color: black;">HIGH</span></p></td></tr><tr style="mso-yfti-irow: 5; mso-yfti-lastrow: yes; height: .9pt;"><td style="width: 85.85pt; border-style: none solid none none; border-right-color: #cdcdcd; padding: 5.75pt 5.4pt; height: 0.9pt; border-width: initial 1.5pt initial initial;" width="114"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; color: black;"> </span></p></td><td style="width: 337.25pt; border-style: none solid solid none; border-bottom-color: #cdcdcd; border-right-color: #cdcdcd; padding: 5.75pt 5.4pt; height: 0.9pt; border-width: initial 1.5pt 1.5pt initial;" colspan="4" width="450"><p class="MsoNormal" style="margin-bottom: 0cm; text-align: center; line-height: normal;" align="center"><b><span lang="EN-US" style="font-family: 'Calibri',sans-serif; mso-ascii-theme-font: major-latin; mso-fareast-font-family: 'Times New Roman'; mso-hansi-theme-font: major-latin; mso-bidi-theme-font: major-latin; color: black;">Likelihood</span></b></p></td></tr></tbody></table><p class="MsoNormal"> </p></div>						</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-4ca23e0 e-con-full e-flex e-con e-child" data-id="4ca23e0" data-element_type="container">
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-f5cdcc2 e-flex e-con-boxed e-con e-parent" data-id="f5cdcc2" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-25853b2 e-con-full e-flex e-con e-child" data-id="25853b2" data-element_type="container">
				</div>
		<div class="elementor-element elementor-element-cc333e3 e-con-full e-flex e-con e-child" data-id="cc333e3" data-element_type="container">
				<div class="elementor-element elementor-element-205a0d1 elementor-widget elementor-widget-text-editor" data-id="205a0d1" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p class="MsoNormal"><span lang="EN-US"> To prioritize findings in a meaningful and actionable way, audit results are typically classified using a risk-based approach inspired by OWASP methodologies. Each finding is evaluated as a combination of:</span></p><ul><li style="list-style-type: none;"><ul><li class="MsoNormal"> likelihood of exploitation, </li><li class="MsoNormal">potential impact on confidentiality, integrity, and availability.</li></ul></li></ul><p class="MsoNormal"><span lang="EN-US"> </span></p><p class="MsoNormal"><span lang="EN-US">This allows organizations to distinguish between:</span></p><ul><li style="list-style-type: none;"><ul><li class="MsoNormal"> critical risks with immediate business impact, </li><li class="MsoNormal">medium and low risks related to configuration hardening and attack surface reduction,</li><li class="MsoNormal"> best-practice recommendations aimed at long-term security maturity.</li></ul></li></ul>						</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-75921b3 e-con-full e-flex e-con e-child" data-id="75921b3" data-element_type="container">
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-946a336 e-flex e-con-boxed e-con e-parent" data-id="946a336" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-e26da36 elementor-widget elementor-widget-spacer" data-id="e26da36" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-fde5878 e-flex e-con-boxed e-con e-parent" data-id="fde5878" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-90ba2d6 e-con-full e-flex e-con e-child" data-id="90ba2d6" data-element_type="container">
				</div>
		<div class="elementor-element elementor-element-b22a03b e-con-full e-flex e-con e-child" data-id="b22a03b" data-element_type="container">
				<div class="elementor-element elementor-element-69899c9 elementor-widget elementor-widget-text-editor" data-id="69899c9" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h3><span lang="EN-US">Keycloak-side</span><b><span lang="EN-US"> audit – known patterns, real-world consequences</span></b></h3><p><b><span lang="EN-US"> </span></b></p><p class="MsoNormal"><span lang="EN-US"><a href="https://inero-software.com/best-keycloak-practices/">Configuration aspects of Keycloak itself are well documented and widely discussed in official  documentation and community guidelines</a>. Nevertheless, real-world audits of large-scale deployments consistently reveal recurring issues such as:</span></p><ul><li style="list-style-type: none;"><ul><li class="MsoNormal"><span lang="EN-US">lack of regular realm key rotation,</span></li><li class="MsoNormal"><span lang="EN-US">missing client secret rotation,</span></li><li class="MsoNormal"><span lang="EN-US">overly permissive redirect URIs and web origins,</span></li><li class="MsoNormal"><span lang="EN-US">unused but enabled service accounts,</span></li><li class="MsoNormal"><span lang="EN-US">globally enabled “full scope allowed” settings,</span></li><li class="MsoNormal"><span lang="EN-US">deprecated direct access grants left active,</span></li><li class="MsoNormal"><span lang="EN-US">missing or inconsistent enforcement of PKCE.</span></li></ul></li></ul><p class="MsoNormal"><span lang="EN-US"> </span></p><blockquote><p class="MsoNormal"><span lang="EN-US">While these topics are well known, they are worth revisiting from an operational perspective. In large, multi-realm Keycloak deployments, even seemingly minor configuration oversights can accumulate and significantly increase the overall attack surface.</span></p></blockquote>						</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-9503a76 e-con-full e-flex e-con e-child" data-id="9503a76" data-element_type="container">
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-1e30445 e-flex e-con-boxed e-con e-parent" data-id="1e30445" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-149bd34 elementor-widget elementor-widget-spacer" data-id="149bd34" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-c9c066d e-flex e-con-boxed e-con e-parent" data-id="c9c066d" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-e1250b7 elementor-widget elementor-widget-spacer" data-id="e1250b7" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-dc00e5e e-flex e-con-boxed e-con e-parent" data-id="dc00e5e" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-db7a09c e-con-full e-flex e-con e-child" data-id="db7a09c" data-element_type="container">
				</div>
		<div class="elementor-element elementor-element-6f60a0d e-con-full e-flex e-con e-child" data-id="6f60a0d" data-element_type="container">
				<div class="elementor-element elementor-element-06970d8 elementor-widget elementor-widget-text-editor" data-id="06970d8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2 class="MsoNormal"><span lang="EN-US">2. Client-side audit – where the highest risks emerge</span></h2><p>From a security standpoint, the most sensitive and often underestimated part of a Keycloak deployment is the client application layer. Even a well-configured Authorization Server cannot compensate for insecure client-side implementations.</p><blockquote><p>“In real-world Keycloak deployments, the most critical security risks rarely originate in the IAM platform itself — they emerge at the client application layer.”</p></blockquote><p>In practice, the most severe findings during Keycloak audits are almost always related to how applications consume tokens, validate authentication state, and handle sensitive data after a successful login.</p><h5> </h5><h5>Missing token validation in client applications</h5><p>One of the most critical issues observed in enterprise environments is incomplete or missing access token validation on the application side. This includes scenarios where:</p><ul><li style="list-style-type: none;"><ul><li>endpoints do not verify authentication at all,</li><li>token signatures or claims are not fully validated,</li><li>authorization checks are inconsistently applied across APIs.</li></ul></li></ul><p>Such vulnerabilities effectively bypass Keycloak entirely, allowing attackers to interact directly with application endpoints without compromising the IAM platform itself.</p><h5> </h5><h5>Insecure token storage and handling</h5><p>Another high-impact issue involves improper handling of access tokens within client applications. Common anti-patterns include:</p><ul><li style="list-style-type: none;"><ul><li>storing tokens in cookies without Secure or HttpOnly flags,</li><li>persisting tokens in local or session storage,</li><li>sharing tokens across application components in a durable form.</li></ul></li></ul><p>In browser-based applications, these practices dramatically increase exposure to XSS attacks and session hijacking. From an architectural perspective, this is an application design flaw rather than a Keycloak configuration issue.</p><h5> </h5><h5>Token transmission via URLs</h5><p>Despite being widely discouraged, access tokens are still occasionally transmitted through URL query parameters or redirects, especially in legacy systems. This practice poses a severe security risk, as tokens may be exposed through:</p><ul><li style="list-style-type: none;"><ul><li>browser history,</li><li>server and proxy logs,</li><li>monitoring and analytics tools,</li><li>third-party integrations.</li></ul></li></ul><p>In multi-application IAM environments, such leakage can have cascading effects across multiple systems.</p><h5> </h5><h5>Incomplete PKCE or nonce support</h5><p>Some client applications technically use the Authorization Code Flow, but fail to:</p><ul><li style="list-style-type: none;"><ul><li>properly implement PKCE,</li><li>validate nonce values,</li><li>or explicitly enforce secure defaults in client libraries.</li></ul></li></ul><p>In complex deployments with numerous redirect paths and client types, this significantly increases the risk of authorization code injection attacks, even when Keycloak itself is correctly configured.</p><p>Missing security headers and improper cookie configuration</p><p>Finally, many audited applications lack basic web security hardening measures such as:</p><ul><li style="list-style-type: none;"><ul><li>Content-Security-Policy (CSP),</li><li>HTTP Strict Transport Security (HSTS),</li><li>properly configured SameSite cookie attributes.</li></ul></li></ul><p> </p><p><strong>These controls are not managed by Keycloak, yet they play a crucial role in protecting authentication flows and user sessions at the application level.</strong></p>						</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-3af0d31 e-con-full e-flex e-con e-child" data-id="3af0d31" data-element_type="container">
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-aab7bdc e-flex e-con-boxed e-con e-parent" data-id="aab7bdc" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-d4b4986 elementor-widget elementor-widget-spacer" data-id="d4b4986" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-4273c47 e-flex e-con-boxed e-con e-parent" data-id="4273c47" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-449f2ba e-con-full e-flex e-con e-child" data-id="449f2ba" data-element_type="container">
				</div>
		<div class="elementor-element elementor-element-978d452 e-con-full e-flex e-con e-child" data-id="978d452" data-element_type="container">
				<div class="elementor-element elementor-element-604823d elementor-widget elementor-widget-text-editor" data-id="604823d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2>Summary</h2><p>Auditing a Keycloak deployment in an enterprise environment requires looking far beyond realm and client configuration screens. While proper Keycloak hardening is essential, the highest security risks typically arise from insecure client-side implementations and architectural decisions.</p><p> </p><blockquote><p>“Keycloak can be hardened perfectly, yet the overall security posture will always be defined by the weakest client application integrated with it.”</p></blockquote><p> </p><p>Based on practical audit experience in large, multi-realm Keycloak environments:</p><ul><li style="list-style-type: none;"><ul><li>the most critical vulnerabilities emerge at the intersection of Keycloak and client applications,</li><li>correct IAM configuration does not mitigate insecure application behavior,</li><li>many high-impact issues can be resolved without changes to Keycloak itself, by improving application architecture and integration patterns.</li></ul></li></ul><p> </p><p>A well-executed Keycloak security audit helps organizations reduce attack surface, standardize IAM integrations, and safely scale their identity infrastructure across teams, environments, and business units.</p><p> </p><p>In large organizations, Keycloak effectively becomes the backbone of digital identity — and its real security strength is determined by the weakest link in the surrounding application ecosystem.</p>						</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-ed20b07 e-con-full e-flex e-con e-child" data-id="ed20b07" data-element_type="container">
				</div>
					</div>
				</div>
				</div>
		<p>Artykuł <a href="https://inero-software.com/keycloak-deployment-auditing-general-scope-and-guidelines/">Keycloak Deployment Auditing – General Scope and Guidelines</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8306</post-id>	</item>
		<item>
		<title>Implementing an AI-Powered Telephony Service Center with ElevenLabs &#038; LiveAPI</title>
		<link>https://inero-software.com/enterprise-ai-telephony/</link>
		
		<dc:creator><![CDATA[Andrzej Chybicki]]></dc:creator>
		<pubDate>Mon, 17 Nov 2025 11:18:27 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[AI call center]]></category>
		<category><![CDATA[AI telephony]]></category>
		<category><![CDATA[AI voice pipelines]]></category>
		<category><![CDATA[conversational AI]]></category>
		<category><![CDATA[enterprise AI]]></category>
		<category><![CDATA[GDPR compliance]]></category>
		<category><![CDATA[LiveAPI]]></category>
		<category><![CDATA[LLM voice interfaces]]></category>
		<category><![CDATA[real-time voice systems]]></category>
		<category><![CDATA[streaming AI;]]></category>
		<category><![CDATA[telephony integration]]></category>
		<category><![CDATA[voice automation]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=8238</guid>

					<description><![CDATA[<p>Implementing an AI-Powered Telephony Service Center with ElevenLabs &#38; LiveAPI Over the past year, advancements in real-time AI models and high‑fidelity speech synthesis have accelerated the development of AI-driven telephony systems. At Inero, we’ve had the opportunity to integrate modern telephony solutions with LiveAPI technology and ElevenLabs’ voice engine to&#8230;</p>
<p>Artykuł <a href="https://inero-software.com/enterprise-ai-telephony/">Implementing an AI-Powered Telephony Service Center with ElevenLabs &#038; LiveAPI</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="8238" class="elementor elementor-8238" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-44c8f7e e-flex e-con-boxed e-con e-parent" data-id="44c8f7e" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-cfa815a elementor-widget elementor-widget-spacer" data-id="cfa815a" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-6cc775b e-flex e-con-boxed e-con e-parent" data-id="6cc775b" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-ad26502 e-con-full e-flex e-con e-child" data-id="ad26502" data-element_type="container">
				</div>
		<div class="elementor-element elementor-element-4974bf1 e-con-full e-flex e-con e-child" data-id="4974bf1" data-element_type="container">
				<div class="elementor-element elementor-element-dc50676 elementor-widget elementor-widget-text-editor" data-id="dc50676" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h1><span lang="EN-US">Implementing an AI-Powered Telephony Service Center with ElevenLabs &amp; LiveAPI</span></h1><p> </p><p class="MsoNormal"><span lang="EN-US">Over the past year, advancements in real-time AI models and high‑fidelity speech synthesis have accelerated the development of AI-driven telephony systems. At Inero, we’ve had the opportunity to integrate modern telephony solutions with LiveAPI technology and ElevenLabs’ voice engine to create a human‑like, responsive, GDPR‑compliant communication experience for a major corporate client.<br /><br />This article combines two perspectives: a high-level overview of LiveAPI and ElevenLabs technology, and a behind‑the‑scenes look at our practical engineering experience while delivering a real-world AI telephony solution.</span></p>						</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-5ab22b7 e-con-full e-flex e-con e-child" data-id="5ab22b7" data-element_type="container">
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-0150de1 e-flex e-con-boxed e-con e-parent" data-id="0150de1" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-e45f203 e-con-full e-flex e-con e-child" data-id="e45f203" data-element_type="container">
				</div>
		<div class="elementor-element elementor-element-a617588 e-con-full e-flex e-con e-child" data-id="a617588" data-element_type="container">
				<div class="elementor-element elementor-element-83d612c elementor-widget elementor-widget-spacer" data-id="83d612c" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-e0cafc0 elementor-widget elementor-widget-text-editor" data-id="e0cafc0" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2><span lang="EN-US">1. What Makes LiveAPI and ElevenLabs a Powerful Combination?</span></h2><p> </p><p class="MsoNormal"><span lang="EN-US">LiveAPI solutions such as OpenAI Realtime API and Google Gemini Live API shift the paradigm from static prompts to streaming, interactive communication. These systems support real‑time audio input, low‑latency responses, natural interrupt handling, and multimodal context.<br /><br />ElevenLabs complements this with industry‑leading voice synthesis. Its realistic, expressive voices and advanced prosody control enable AI agents that sound convincingly human. For telephony environments, this matters — clients expect clarity, confidence, and a pleasant conversational tone.</span></p>						</div>
				</div>
		<div class="elementor-element elementor-element-275490b e-con-full e-flex e-con e-child" data-id="275490b" data-element_type="container">
				<div class="elementor-element elementor-element-b98492a elementor-widget elementor-widget-image" data-id="b98492a" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img fetchpriority="high" decoding="async" data-attachment-id="8251" data-permalink="https://inero-software.com/enterprise-ai-telephony/liveapi_elevenlabs_interactionmodel/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/11/LiveAPI_ElevenLabs_InteractionModel.png" data-orig-size="1536,1024" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="LiveAPI + ElevenLabs Interaction Model" data-image-description="&lt;p&gt;A clean, purple-themed diagram visualizing the data flow in an AI-powered telephony system. The graphic illustrates how a user speaks into a microphone, how the audio is processed by a LiveAPI voice LLM, and how the response is synthesized by ElevenLabs TTS before returning to the user as speech. The design represents a real-time, low-latency interaction loop used in modern conversational AI and telephony integrations.&lt;/p&gt;
" data-image-caption="&lt;p&gt;How user audio flows through LiveAPI and ElevenLabs TTS to create real-time voice responses.&lt;/p&gt;
" data-medium-file="https://inero-software.com/wp-content/uploads/2025/11/LiveAPI_ElevenLabs_InteractionModel-300x200.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/11/LiveAPI_ElevenLabs_InteractionModel-1030x687.png" tabindex="0" role="button" width="1030" height="687" src="https://inero-software.com/wp-content/uploads/2025/11/LiveAPI_ElevenLabs_InteractionModel-1030x687.png" class="attachment-large size-large wp-image-8251" alt="Diagram showing the interaction flow between a user, a LiveAPI voice model, and ElevenLabs TTS in a real-time AI telephony system." srcset="https://inero-software.com/wp-content/uploads/2025/11/LiveAPI_ElevenLabs_InteractionModel-1030x687.png 1030w, https://inero-software.com/wp-content/uploads/2025/11/LiveAPI_ElevenLabs_InteractionModel-300x200.png 300w, https://inero-software.com/wp-content/uploads/2025/11/LiveAPI_ElevenLabs_InteractionModel-768x512.png 768w, https://inero-software.com/wp-content/uploads/2025/11/LiveAPI_ElevenLabs_InteractionModel-450x300.png 450w, https://inero-software.com/wp-content/uploads/2025/11/LiveAPI_ElevenLabs_InteractionModel.png 1536w" sizes="(max-width: 1030px) 100vw, 1030px" data-attachment-id="8251" data-permalink="https://inero-software.com/enterprise-ai-telephony/liveapi_elevenlabs_interactionmodel/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/11/LiveAPI_ElevenLabs_InteractionModel.png" data-orig-size="1536,1024" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="LiveAPI + ElevenLabs Interaction Model" data-image-description="&lt;p&gt;A clean, purple-themed diagram visualizing the data flow in an AI-powered telephony system. The graphic illustrates how a user speaks into a microphone, how the audio is processed by a LiveAPI voice LLM, and how the response is synthesized by ElevenLabs TTS before returning to the user as speech. The design represents a real-time, low-latency interaction loop used in modern conversational AI and telephony integrations.&lt;/p&gt;
" data-image-caption="&lt;p&gt;How user audio flows through LiveAPI and ElevenLabs TTS to create real-time voice responses.&lt;/p&gt;
" data-medium-file="https://inero-software.com/wp-content/uploads/2025/11/LiveAPI_ElevenLabs_InteractionModel-300x200.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/11/LiveAPI_ElevenLabs_InteractionModel-1030x687.png" role="button" />													</div>
				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-ca7edd1 e-con-full e-flex e-con e-child" data-id="ca7edd1" data-element_type="container">
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-3553e31 e-flex e-con-boxed e-con e-parent" data-id="3553e31" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-4d3148a e-con-full e-flex e-con e-child" data-id="4d3148a" data-element_type="container">
				</div>
		<div class="elementor-element elementor-element-5d07d44 e-con-full e-flex e-con e-child" data-id="5d07d44" data-element_type="container">
				<div class="elementor-element elementor-element-1a97268 elementor-widget elementor-widget-spacer" data-id="1a97268" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-02ef01f elementor-widget elementor-widget-text-editor" data-id="02ef01f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2><span lang="EN-US">2. Why GDPR Compliance Shapes the Choice of API in Europe</span></h2><p class="MsoNormal"><span lang="EN-US">For European organisations, GDPR compliance is not optional — it defines which AI vendors can be used in production. Although both OpenAI and Google offer real-time APIs, enterprises operating in the EU often restrict use to providers ensuring transparent, EU‑aligned data governance. In practice, this means that Gemini Live API was the viable choice for our implementation, while OpenAI was excluded despite strong technical capabilities.</span></p>						</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-b6d89f4 e-con-full e-flex e-con e-child" data-id="b6d89f4" data-element_type="container">
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-edad7b5 e-flex e-con-boxed e-con e-parent" data-id="edad7b5" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-8da2a35 e-con-full e-flex e-con e-child" data-id="8da2a35" data-element_type="container">
				</div>
		<div class="elementor-element elementor-element-6d9a181 e-con-full e-flex e-con e-child" data-id="6d9a181" data-element_type="container">
				<div class="elementor-element elementor-element-567ff66 elementor-widget elementor-widget-spacer" data-id="567ff66" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-f5c5517 elementor-widget elementor-widget-text-editor" data-id="f5c5517" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2><span lang="EN-US">3. Our Practical Experience Integrating Telephony with LiveAPI and ElevenLabs</span></h2><p class="MsoNormal"><span lang="EN-US">Below we outline the key lessons, challenges, and engineering decisions from our implementation.</span></p><p class="MsoNormal"><span lang="EN-US"> </span></p><h3><span lang="EN-US">3.1 Project Context</span></h3><p class="MsoNormal"><span lang="EN-US">Our client — a large corporate organisation — required a system capable of handling outbound and inbound calls automatically, while maintaining a tone and responsiveness extremely close to human interaction. The goal was not a simple IVR or menu system, but a natural, fully conversational experience driven by real‑time AI.</span></p><p class="MsoNormal"><span lang="EN-US"> </span></p><h3><span lang="EN-US">3.2 Technology Stack and Constraints</span></h3><p class="MsoNormal"><span lang="EN-US">We evaluated both OpenAI and Gemini Live APIs to compare latency, contextual reasoning and streaming quality. However, due to GDPR compliance requirements, the production system was designed around Gemini Live API. ElevenLabs provided the speech synthesis layer, offering high realism and consistent quality across telephony channels.</span></p>						</div>
				</div>
				<div class="elementor-element elementor-element-a79ca65 elementor-widget elementor-widget-image" data-id="a79ca65" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img decoding="async" data-attachment-id="8260" data-permalink="https://inero-software.com/enterprise-ai-telephony/telephony_elevenlabs_pipeline-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/11/Telephony_ElevenLabs_Pipeline-1.png" data-orig-size="1536,1024" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="AI Telephony Pipleine" data-image-description="&lt;p&gt;Diagram showing the processing pipeline from telephony audio through LiveAPI to ElevenLabs TTS in an AI-powered voice system.&lt;/p&gt;
" data-image-caption="&lt;p&gt;Diagram showing the processing pipeline from telephony audio through LiveAPI to ElevenLabs TTS in an AI-powered voice system.&lt;/p&gt;
" data-medium-file="https://inero-software.com/wp-content/uploads/2025/11/Telephony_ElevenLabs_Pipeline-1-300x200.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/11/Telephony_ElevenLabs_Pipeline-1-1030x687.png" tabindex="0" role="button" width="768" height="512" src="https://inero-software.com/wp-content/uploads/2025/11/Telephony_ElevenLabs_Pipeline-1-768x512.png" class="attachment-medium_large size-medium_large wp-image-8260" alt="Telephony with AI Processing Pipeline" srcset="https://inero-software.com/wp-content/uploads/2025/11/Telephony_ElevenLabs_Pipeline-1-768x512.png 768w, https://inero-software.com/wp-content/uploads/2025/11/Telephony_ElevenLabs_Pipeline-1-300x200.png 300w, https://inero-software.com/wp-content/uploads/2025/11/Telephony_ElevenLabs_Pipeline-1-1030x687.png 1030w, https://inero-software.com/wp-content/uploads/2025/11/Telephony_ElevenLabs_Pipeline-1.png 1536w" sizes="(max-width: 768px) 100vw, 768px" data-attachment-id="8260" data-permalink="https://inero-software.com/enterprise-ai-telephony/telephony_elevenlabs_pipeline-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/11/Telephony_ElevenLabs_Pipeline-1.png" data-orig-size="1536,1024" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="AI Telephony Pipleine" data-image-description="&lt;p&gt;Diagram showing the processing pipeline from telephony audio through LiveAPI to ElevenLabs TTS in an AI-powered voice system.&lt;/p&gt;
" data-image-caption="&lt;p&gt;Diagram showing the processing pipeline from telephony audio through LiveAPI to ElevenLabs TTS in an AI-powered voice system.&lt;/p&gt;
" data-medium-file="https://inero-software.com/wp-content/uploads/2025/11/Telephony_ElevenLabs_Pipeline-1-300x200.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/11/Telephony_ElevenLabs_Pipeline-1-1030x687.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-1ed3b4d elementor-widget elementor-widget-text-editor" data-id="1ed3b4d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h3 style="font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;"><span lang="EN-US">3.3 Key Engineering Challenges</span></h3><p class="MsoNormal" style="font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; font-size: 14px; font-family: Roboto, sans-serif;"><span lang="EN-US">Beyond typical engineering concerns like audio quality, session stability, and call routing, the most demanding challenge was not purely technical — it was understanding how real users communicate over the phone. Subtle behaviors such as interruptions, hesitation, changing tone, or switching context required careful analysis and extensive testing.</span></p><p style="font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; font-size: 14px; font-family: Roboto, sans-serif;">We also dealt with several micro‑issues, such as premature call termination, incorrect end‑of‑utterance detection, and managing the timing between user speech and AI responses.</p><p style="font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; font-size: 14px; font-family: Roboto, sans-serif;"> </p><h3 style="font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;"><span lang="EN-US">3.4 What We Built Ourselves</span></h3><p class="MsoNormal" style="font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; font-size: 14px; font-family: Roboto, sans-serif;"><span lang="EN-US">AI models are inherently non‑deterministic and cannot be fully controlled like classic software components. To ensure predictable and business‑aligned outcomes, we developed backend modules responsible for:<br />• Conversation flow supervision<br />• Session state tracking<br />• Monitoring and logging voice interactions<br />• Handling edge cases and ambiguous user inputs</span></p><p style="font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; font-size: 14px; font-family: Roboto, sans-serif;">ElevenLabs’ tooling, especially the Hard Disk service, significantly supported our workflow, but the orchestration layer was built entirely by Inero.</p><p style="font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; font-size: 14px; font-family: Roboto, sans-serif;"> </p><h3 style="font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;"><span lang="EN-US">3.5 What We Learned</span></h3><p class="MsoNormal" style="font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; font-size: 14px; font-family: Roboto, sans-serif;"><span lang="EN-US">The most important insight: designing a telephony AI system requires deep understanding of the user’s context, combined with the business objectives of the project. Quick prototyping and iterative PoC testing were essential — allowing us to validate conversational patterns early, reveal unexpected user behavior, and refine the interaction design.</span></p><p style="font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; font-size: 14px; font-family: Roboto, sans-serif;">Ultimately, success depended on aligning the AI’s conversational style with how real customers naturally speak, pause, and respond during a phone call.</p>						</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-4d8ebb5 e-con-full e-flex e-con e-child" data-id="4d8ebb5" data-element_type="container">
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-36fce65 e-flex e-con-boxed e-con e-parent" data-id="36fce65" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-bafc838 elementor-widget elementor-widget-spacer" data-id="bafc838" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-f0ecd4f e-flex e-con-boxed e-con e-parent" data-id="f0ecd4f" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-a477dbd e-con-full e-flex e-con e-child" data-id="a477dbd" data-element_type="container">
				</div>
		<div class="elementor-element elementor-element-326a90c e-con-full e-flex e-con e-child" data-id="326a90c" data-element_type="container">
				<div class="elementor-element elementor-element-1fab35c elementor-widget elementor-widget-text-editor" data-id="1fab35c" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2><span lang="EN-US">4. GDPR Considerations in AI Telephony</span></h2><p> </p><p class="MsoNormal"><span lang="EN-US">All audio handling, session storage, and logging were designed according to GDPR principles: strict data minimisation, no training on user audio, encrypted transmission, and optional anonymisation of transcriptions. Where possible, processing was routed through EU‑aligned infrastructure.</span></p>						</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-fdd54ad e-con-full e-flex e-con e-child" data-id="fdd54ad" data-element_type="container">
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-59b4a48 e-flex e-con-boxed e-con e-parent" data-id="59b4a48" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-9ace4b8 elementor-widget elementor-widget-spacer" data-id="9ace4b8" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-bc2dbef e-flex e-con-boxed e-con e-parent" data-id="bc2dbef" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-ec7d459 e-con-full e-flex e-con e-child" data-id="ec7d459" data-element_type="container">
				</div>
		<div class="elementor-element elementor-element-46c6762 e-con-full e-flex e-con e-child" data-id="46c6762" data-element_type="container">
				<div class="elementor-element elementor-element-792a12f elementor-widget elementor-widget-text-editor" data-id="792a12f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2><span lang="EN-US">Conclusion<o:p></o:p></span></h2><p>

</p><p class="MsoNormal"><span lang="EN-US">Implementing an AI‑driven telephony service
center requires more than connecting APIs — it requires understanding users,
managing nuanced conversational flows, and ensuring full compliance with EU
regulations. Our experience shows that LiveAPI technologies combined with
ElevenLabs can deliver highly human‑like, responsive, and scalable
communication channels for enterprise clients.<o:p></o:p></span></p>						</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-421f13d e-con-full e-flex e-con e-child" data-id="421f13d" data-element_type="container">
				</div>
					</div>
				</div>
				</div>
		<p>Artykuł <a href="https://inero-software.com/enterprise-ai-telephony/">Implementing an AI-Powered Telephony Service Center with ElevenLabs &#038; LiveAPI</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8238</post-id>	</item>
		<item>
		<title>Secure Email Delivery in Keycloak 26.2 Using XOAUTH2</title>
		<link>https://inero-software.com/secure-email-delivery-in-keycloak-26-2-using-xoauth2/</link>
		
		<dc:creator><![CDATA[Andrzej Chybicki]]></dc:creator>
		<pubDate>Mon, 15 Sep 2025 10:48:22 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Keycloak]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[keycloak]]></category>
		<category><![CDATA[Multi-Factor Authentication]]></category>
		<category><![CDATA[SMTP]]></category>
		<category><![CDATA[XOAUTH2]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=8141</guid>

					<description><![CDATA[<p>Secure Email Delivery in Keycloak 26.2 Using XOAUTH2 Email has been one of the oldest and most fundamental services on the internet, used for notifications, password resets, verifications, and more. Over time we’ve seen major improvements — encryption via TLS, then STARTTLS, and now many providers are moving away from&#8230;</p>
<p>Artykuł <a href="https://inero-software.com/secure-email-delivery-in-keycloak-26-2-using-xoauth2/">Secure Email Delivery in Keycloak 26.2 Using XOAUTH2</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="8141" class="elementor elementor-8141" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-bb57bd9 e-flex e-con-boxed e-con e-parent" data-id="bb57bd9" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-437b6d1 elementor-widget elementor-widget-spacer" data-id="437b6d1" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-db34a4b e-flex e-con-boxed e-con e-parent" data-id="db34a4b" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-641bb6a elementor-widget elementor-widget-spacer" data-id="641bb6a" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-50bb99f e-flex e-con-boxed e-con e-parent" data-id="50bb99f" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-4a41088 elementor-widget elementor-widget-text-editor" data-id="4a41088" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h1>Secure Email Delivery in Keycloak 26.2 Using XOAUTH2</h1><p>Email has been one of the oldest and most fundamental services on the internet, used for notifications, password resets, verifications, and more. Over time we’ve seen major improvements — encryption via TLS, then STARTTLS, and now many providers are moving away from basic password authentication in favor of modern token-based schemes like XOAUTH2. With Keycloak 26.2, this evolution has arrived: Keycloak now supports XOAUTH2 for outgoing SMTP mail, adding greater security and compatibility with providers who have deprecated legacy authentication</p>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-8c716d3 e-flex e-con-boxed e-con e-parent" data-id="8c716d3" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-45fb36f elementor-widget elementor-widget-spacer" data-id="45fb36f" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-b657726 e-flex e-con-boxed e-con e-parent" data-id="b657726" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-a743437 elementor-widget elementor-widget-text-editor" data-id="a743437" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2>1. What is XOAUTH2, and Why It Matters</h2><p>XOAUTH2 is a means of authenticating to an SMTP (or other email-sending) server using an OAuth2 access token rather than a username + password. Some of the key benefits include:</p><ul><li style="list-style-type: none;"><ul><li>Improved Security: Tokens can be more tightly controlled, with limited scope and lifetime.</li><li>Compliance with Modern Providers: Many providers are disabling basic auth.</li><li>Centralised and Auditable Auth: Easier management and rotation. Each client&#8217;s access can be revoked independently of other clients&#8217; operations.</li><li>Reduced Risk of Credential Leakage: No raw passwords stored or transmitted.</li></ul></li></ul>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-49d6f0b e-flex e-con-boxed e-con e-parent" data-id="49d6f0b" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-761d03b elementor-widget elementor-widget-spacer" data-id="761d03b" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-cac6421 e-flex e-con-boxed e-con e-parent" data-id="cac6421" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-dc1c0d3 elementor-widget elementor-widget-text-editor" data-id="dc1c0d3" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2>2. How XOAUTH2 is Implemented in Keycloak 26.2</h2><p>With version 26.2, Keycloak adds native support for XOAUTH2 when sending emails via SMTP. This means administrators can move away from static username and password credentials and instead configure Keycloak to obtain an OAuth2 access token at runtime.</p><p>In the Admin Console under Realm → Realm Settings → Email, you can now switch the Authentication Type from Password to Token (XOAUTH2). Once enabled, additional fields appear where you provide:</p><p>&#8211; Client ID and Client Secret from your identity provider (e.g., Azure AD).<br />&#8211; The OAuth2 Token Endpoint used to request an access token.<br />&#8211; Optional Scopes, depending on your provider (for Microsoft 365: https://outlook.office365.com/.default).<br />&#8211; A From address / SMTP username, which may still be required by the mail server.</p><p>Keycloak then handles the process of requesting and refreshing tokens using the Client Credentials Grant flow. You can use the “Test connection” button to verify that the configuration is correct and that emails can be sent successfully.</p><p>This approach aligns Keycloak with modern security standards and prepares deployments for providers that are phasing out legacy authentication.</p><p><img decoding="async" data-attachment-id="8207" data-permalink="https://inero-software.com/image-12/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/09/image-12.png" data-orig-size="1235,1095" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image (12)" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/09/image-12-300x266.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/09/image-12-1030x913.png" tabindex="0" role="button" class="aligncenter wp-image-8207 size-large" src="https://inero-software.com/wp-content/uploads/2025/09/image-12-1030x913.png" alt="" width="1030" height="913" srcset="https://inero-software.com/wp-content/uploads/2025/09/image-12-1030x913.png 1030w, https://inero-software.com/wp-content/uploads/2025/09/image-12-300x266.png 300w, https://inero-software.com/wp-content/uploads/2025/09/image-12-768x681.png 768w, https://inero-software.com/wp-content/uploads/2025/09/image-12-338x300.png 338w, https://inero-software.com/wp-content/uploads/2025/09/image-12.png 1235w" sizes="(max-width: 1030px) 100vw, 1030px" /></p><p><strong data-start="0" data-end="9" data-is-only-node="">Note:</strong> The <strong data-start="14" data-end="35">Enable Debug SMTP</strong> option (visible at the bottom of the form) activates extended logging for outgoing email. When enabled, Keycloak produces detailed debug output of the SMTP communication, which can be very useful for diagnosing integration issues such as authentication failures, token retrieval problems, or TLS misconfigurations. It is recommended to use this setting only in testing or troubleshooting scenarios, as it may expose sensitive information in the logs.</p>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-2e4203c e-flex e-con-boxed e-con e-parent" data-id="2e4203c" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-44a4294 elementor-widget elementor-widget-spacer" data-id="44a4294" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-94072c9 e-flex e-con-boxed e-con e-parent" data-id="94072c9" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-802a36b elementor-widget__width-inherit elementor-invisible elementor-widget elementor-widget-text-editor" data-id="802a36b" data-element_type="widget" data-settings="{&quot;_animation&quot;:&quot;fadeIn&quot;}" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4 style="text-align: center;"><span style="color: #431773;">Retirement of Basic Authentication for SMTP AUTH (Client Submission) in Exchange Online</span></h4>						</div>
				</div>
				<div class="elementor-element elementor-element-5f3b86e elementor-widget elementor-widget-spacer" data-id="5f3b86e" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-86a8aa1 e-flex e-con-boxed e-con e-parent" data-id="86a8aa1" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-2b76e0f elementor-widget elementor-widget-spacer" data-id="2b76e0f" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-04082db e-flex e-con-boxed e-con e-parent" data-id="04082db" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-7185a3d elementor-countdown--label-inline elementor-widget elementor-widget-countdown" data-id="7185a3d" data-element_type="widget" data-settings="{&quot;motion_fx_motion_fx_scrolling&quot;:&quot;yes&quot;,&quot;motion_fx_devices&quot;:[&quot;desktop&quot;,&quot;tablet&quot;,&quot;mobile&quot;]}" data-widget_type="countdown.default">
				<div class="elementor-widget-container">
					<div class="elementor-countdown-wrapper" data-date="1772319600">
			<div class="elementor-countdown-item"><span class="elementor-countdown-digits elementor-countdown-days"></span> <span class="elementor-countdown-label">Days</span></div><div class="elementor-countdown-item"><span class="elementor-countdown-digits elementor-countdown-hours"></span> <span class="elementor-countdown-label">Hours</span></div>		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-846c707 e-flex e-con-boxed e-con e-parent" data-id="846c707" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-bfa7caf elementor-widget elementor-widget-spacer" data-id="bfa7caf" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-0aa70e1 e-flex e-con-boxed e-con e-parent" data-id="0aa70e1" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-1d91819 elementor-widget elementor-widget-text-editor" data-id="1d91819" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2>3. Why This Matters for Microsoft Azure / Office 365 Users</h2><blockquote><p>Microsoft has announced the retirement of Basic Authentication for SMTP AUTH (Client Submission) in Exchange Online. Starting March 1, 2026, Microsoft will begin phasing out Basic Auth, and by April 30, 2026, it will be completely disabled. This change directly impacts Keycloak deployments where outgoing emails are sent via Office 365 / Exchange Online SMTP.</p></blockquote><p>If your Keycloak instance is still configured with a username and password for SMTP, it will stop working once Basic Auth is retired. The solution is to migrate to XOAUTH2 configuration in Keycloak 26.2.</p><p>By adopting XOAUTH2, you ensure:</p><ul><li style="list-style-type: none;"><ul><li>Continued compatibility with Microsoft email services</li><li>Stronger security and compliance</li><li>Reduced risk compared to static credentials</li></ul></li></ul>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-8ef377e e-flex e-con-boxed e-con e-parent" data-id="8ef377e" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-126b40c elementor-widget elementor-widget-spacer" data-id="126b40c" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-0cdb0ae e-flex e-con-boxed e-con e-parent" data-id="0cdb0ae" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-8707cdb elementor-widget elementor-widget-text-editor" data-id="8707cdb" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2><b data-stringify-type="bold">4. Beyond XOAUTH2?</b></h2><p>There’s even more going on in modern email delivery. Many email delivery platforms steer away from traditional SMTP protocol towards API-based approach (e.g. MailJet, SendGrid or MailGun). This gives more flexibility to integrators and allows platform providers to offer additional features. API-based email sending is not jet supported by Keycloak out-of-the-box, but this support can be added via custom extensions. Contact us if you are interested in integrating Keycloak with API-based email delivery platforms.</p>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-cc7f0e5 e-flex e-con-boxed e-con e-parent" data-id="cc7f0e5" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-cbe5851 elementor-widget elementor-widget-spacer" data-id="cbe5851" data-element_type="widget" data-widget_type="spacer.default">
				<div class="elementor-widget-container">
					<div class="elementor-spacer">
			<div class="elementor-spacer-inner"></div>
		</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-edbac9e e-flex e-con-boxed e-con e-parent" data-id="edbac9e" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-121b9ff elementor-widget elementor-widget-text-editor" data-id="121b9ff" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2>Conclusion</h2><p>The addition of XOAUTH2 support in Keycloak 26.2 is more than just a feature upgrade — it’s an essential step for organizations that rely on Office 365, Gmail, or other providers who are deprecating legacy authentication. By adopting XOAUTH2 today, you can future-proof your Keycloak deployment, comply with provider requirements, and improve overall email security.</p>						</div>
				</div>
					</div>
				</div>
				</div>
		<p>Artykuł <a href="https://inero-software.com/secure-email-delivery-in-keycloak-26-2-using-xoauth2/">Secure Email Delivery in Keycloak 26.2 Using XOAUTH2</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8141</post-id>	</item>
		<item>
		<title>Keycloak or SaaS IdP? A Tech Leader’s Guide to Making the Right IAM Choice</title>
		<link>https://inero-software.com/keycloak-or-saas-idp-a-tech-leaders-guide-to-making-the-right-iam-choice/</link>
		
		<dc:creator><![CDATA[Andrzej Chybicki]]></dc:creator>
		<pubDate>Thu, 24 Jul 2025 07:45:53 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Keycloak]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=8063</guid>

					<description><![CDATA[<p>Introduction Shipping single sign‑on quickly is tempting. Stakeholders push for a smooth login experience, developers want to move on to core features, and security teams are eager to tick the “MFA enabled” box. The trouble is that identity and access management (IAM) decisions outlive launch days. Once you choose a&#8230;</p>
<p>Artykuł <a href="https://inero-software.com/keycloak-or-saas-idp-a-tech-leaders-guide-to-making-the-right-iam-choice/">Keycloak or SaaS IdP? A Tech Leader’s Guide to Making the Right IAM Choice</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="8063" class="elementor elementor-8063" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-dd2241f e-flex e-con-boxed e-con e-parent" data-id="dd2241f" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-7a92edd e-con-full e-flex e-con e-child" data-id="7a92edd" data-element_type="container">
				<div class="elementor-element elementor-element-92153e6 elementor-widget elementor-widget-text-editor" data-id="92153e6" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h1><span lang="EN-US">Introduction</span></h1><p class="MsoNormal"><span lang="EN-US">Shipping single sign‑on quickly is tempting. Stakeholders push for a smooth login experience, developers want to move on to core features, and security teams are eager to tick the “MFA enabled” box. The trouble is that identity and access management (IAM) decisions outlive launch days. Once you choose a platform, you inherit its operational model, cost structure and compliance implications for years.</span></p><p class="MsoNormal"><span lang="EN-US">In this blogpost we provide technical leads some few crucial issues when evaluating Keycloak—an open‑source IAM platform that has become a go‑to choice in many Java and cloud‑native environments. Rather than a hands‑on tutorial, you’ll get a decision framework that starts with business realities. We’ll walk through seven questions that determine whether Keycloak fits your context. For each, you’ll see why it matters, how to assess it, the red flags to watch for, and a concrete deliverable to capture the outcome.</span></p><p class="MsoNormal"><span lang="EN-US">By the end, you’ll fill in a short scorecard and see if your organization toward Keycloak, a commercial SaaS IdP (Auth0, Okta, Azure AD B2C, etc.), or a hybrid path. If you want a sanity check, we offer a free 45‑minute Keycloak readiness consultation—no slides, just practical advice.</span></p><p class="MsoNormal"><span lang="EN-US"> </span></p>						</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-1c3872c e-flex e-con-boxed e-con e-parent" data-id="1c3872c" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-ac23027 e-flex e-con-boxed e-con e-child" data-id="ac23027" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-f2b969a elementor-widget elementor-widget-text-editor" data-id="f2b969a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h1><span lang="EN-US">Where Keycloak Lives in Your Stack</span></h1><p class="MsoNormal"><span lang="EN-US">Keycloak usually sits between your user‑facing applications and the identity sources they rely on. Applications delegate authentication and authorization to Keycloak. Keycloak can manage users internally or federate with LDAP/Active Directory. It also exposes logs and metrics that feed your SIEM and monitoring stack. Even if this picture seems obvious to engineers, spelling it out helps align legal, compliance and product stakeholders on who owns what.</span></p>						</div>
				</div>
					</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-926763e e-flex e-con-boxed e-con e-parent" data-id="926763e" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-c0f0f10 elementor-widget elementor-widget-image" data-id="c0f0f10" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" data-attachment-id="8093" data-permalink="https://inero-software.com/keycloak-or-saas-idp-a-tech-leaders-guide-to-making-the-right-iam-choice/keycloak_diagram/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/07/KeyCloak_Diagram-scaled.png" data-orig-size="2560,1777" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="KeyCloak_Diagram" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/07/KeyCloak_Diagram-300x208.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/07/KeyCloak_Diagram-1030x715.png" tabindex="0" role="button" width="768" height="533" src="https://inero-software.com/wp-content/uploads/2025/07/KeyCloak_Diagram-768x533.png" class="attachment-medium_large size-medium_large wp-image-8093" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/07/KeyCloak_Diagram-768x533.png 768w, https://inero-software.com/wp-content/uploads/2025/07/KeyCloak_Diagram-300x208.png 300w, https://inero-software.com/wp-content/uploads/2025/07/KeyCloak_Diagram-1030x715.png 1030w, https://inero-software.com/wp-content/uploads/2025/07/KeyCloak_Diagram-1536x1066.png 1536w, https://inero-software.com/wp-content/uploads/2025/07/KeyCloak_Diagram-2048x1422.png 2048w, https://inero-software.com/wp-content/uploads/2025/07/KeyCloak_Diagram-432x300.png 432w" sizes="(max-width: 768px) 100vw, 768px" data-attachment-id="8093" data-permalink="https://inero-software.com/keycloak-or-saas-idp-a-tech-leaders-guide-to-making-the-right-iam-choice/keycloak_diagram/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/07/KeyCloak_Diagram-scaled.png" data-orig-size="2560,1777" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="KeyCloak_Diagram" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/07/KeyCloak_Diagram-300x208.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/07/KeyCloak_Diagram-1030x715.png" role="button" />													</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-02b5497 e-flex e-con-boxed e-con e-parent" data-id="02b5497" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-1b72159 elementor-widget elementor-widget-text-editor" data-id="1b72159" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h1><span lang="EN-US">Keycloak in a Nutshell (and Two Misconceptions)</span></h1><p class="MsoNormal"><span lang="EN-US">Keycloak is an open‑source IAM server supporting OIDC, SAML, MFA, theming and an extension model (SPIs). Originally developed by Red Hat, it now thrives under a large community.</span></p><p class="MsoNormal"><span lang="EN-US">Misconception #1: “Open source = free to run”. The software is free, but production IAM also needs infrastructure, monitoring, upgrades and people. Misconception #2: “It’s just for developers”. In reality, without governance and processes, any IAM platform becomes a liability.</span></p>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-934ad5e e-flex e-con-boxed e-con e-parent" data-id="934ad5e" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-26d21cd elementor-widget elementor-widget-text-editor" data-id="26d21cd" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h1 style="font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;"><span lang="EN-US">Seven Questions to Frame the Decision</span></h1><div style="font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; font-size: 14px; font-family: Roboto, sans-serif;"><span lang="EN-US"> </span></div><p style="font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; font-size: 14px; font-family: Roboto, sans-serif;"><span lang="EN-US">Treat these questions as a workshop agenda, not a checklist. Bring security, operations, product and finance to the same table. The goal is to leave each session with an artifact that informs budgeting, architecture and planning.</span></p><p style="font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; font-size: 14px; font-family: Roboto, sans-serif;"><span lang="EN-US"> </span></p>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-6beb500 e-flex e-con-boxed e-con e-parent" data-id="6beb500" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-a4797f7 elementor-widget elementor-widget-text-editor" data-id="a4797f7" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2>1. Compliance &amp; Risk: Do You Need Full Control Over IAM?</h2>
<p class="MsoNormal"><span lang="EN-US">Regulatory frameworks such as NIS2 or&nbsp;GDPR—and sector standards like PCI DSS or HIPAA—often demand demonstrable&nbsp;control over identities, audit trails and incident response. If auditors expect&nbsp;you to produce detailed logs or prove exactly who changed what, a black‑box&nbsp;SaaS can create friction&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">List the controls and evidence you must&nbsp;provide. Do you need to host IAM in a specific region?&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">How quickly must you&nbsp;produce logs? Are you required to approve every policy change?&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">If many answers&nbsp;point to tight control, Keycloak’s self‑hosted nature becomes an advantage.</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">The biggest red flag is deferring&nbsp;compliance: “we’ll pass audits later”. Another is that nobody owns IAM data&nbsp;retention or log policies.</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US"><b>Deliverable</b>: a compliance checklist mapped&nbsp;to IAM features and governance processes.</span></p>
<h2><span lang="EN-US">2. Integration Map: How Many Apps and Protocols Today—and in<br>Two Years?</span></h2>
<p><span lang="EN-US">Integration effort—not software&nbsp;choice—usually drives project cost and timeline. Keycloak handles&nbsp;OIDC/SAML/LDAP well, but legacy systems and partner constraints can complicate<br>the picture.&nbsp;</span>Inventory every application that authenticates users. Classify by protocol, business criticality and migration difficulty. Project changes over the next 24 months: new products,</p>
<p><span lang="EN-US">acquisitions, vendor switches.&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><b>Red flags</b>: no authoritative app inventory; underestimating testing for each integration.</p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><b>Deliverable</b>: a prioritized integration&nbsp;backlog with rough sizing.</span></p>
<h2><span lang="EN-US">3. Team &amp; Operations Capacity: Can You Secure and Run It<br>24/7 (or Outsource)?</span></h2>
<p><span lang="EN-US">IAM outages stop business. Someone must&nbsp;patch, monitor, respond to incidents and plan upgrades. Decide whether your&nbsp;DevOps/SecOps team can own this or you’ll offload parts to a partner.</span></p>
<p><span lang="EN-US">Assess on‑call capacity, automation&nbsp;maturity, security expertise. Define SLAs, RTO/RPO. Consider managed services&nbsp;for routine ops while retaining architectural control&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><b>Red flags</b>: a single overworked DevOps, lack&nbsp;of monitoring/alerting, no upgrade plan.</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><b>Deliverable</b>: a RACI matrix for IAM&nbsp;operations and an initial ops budget.</span></p>
<h2><span lang="EN-US">4. Customization Needs: Themes, Extensions and Advanced<br>Authorization</span></h2>
<p><span lang="EN-US">Keycloak’s extensibility is a major&nbsp;advantage: custom authenticators, advanced policies (ABAC), branded login flows, phishing‑resistant UX. If differentiation or strict UX/security is a<br>requirement, flexibility matters.</span></p>
<p><span lang="EN-US">Gauge UX/theming demands, multilingual support, accessibility, device trust, passkeys, fine‑grained authorization.Each adds value to an extensible platform.</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><b>Red flags</b>: assuming the default theme is&nbsp;enough; ignoring SPI development complexity.</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><b>Deliverable</b>: a customization backlog with&nbsp;effort estimates and ownership.</span></p>
<h2><span lang="EN-US">5. Scalability &amp; High Availability: What Are Your Peak<br>Loads and DR Needs?</span></h2>
<p><span lang="EN-US">If login fails, revenue stops. HA/DR design&nbsp;impacts infrastructure cost and complexity. You need clarity on peaks,&nbsp;acceptable downtime and recovery objectives.</span></p>
<p><span lang="EN-US">Estimate peak concurrent logins (launch&nbsp;days, campaigns). Define RTO/RPO. Choose between VM clusters or Kubernetes with&nbsp;an operator. Decide on multi‑region strategies.</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><b>Red flags</b>: “we’ll scale later”, skipping DR tests entirely.</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><b>Deliverable</b>: an HA/DR architecture option&nbsp;matrix with pros, cons and cost</span></p>
<p><span lang="EN-US">.</span></p>
<h2><span lang="EN-US">6. Budget &amp; TCO: What Does Three Years Really Cost vs<br>SaaS?</span></h2>
<p><span lang="EN-US">Keycloak costs = infra + people +&nbsp;consulting. SaaS costs = subscriptions + add‑ons + overage fees.</span></p>
<p><span lang="EN-US">Only a 3‑year&nbsp;TCO model reveals the truth.</span></p>
<p><span lang="EN-US">Build a spreadsheet covering infra,&nbsp;backups, monitoring, labor, upgrades. Do the same for SaaS: MAU fees, advanced features, support tiers. Stress‑test both with growth scenarios.</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><b>Red flags</b>: ignoring people costs, assuming&nbsp;maintenance is free, overlooking SaaS overage triggers.</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><b>Deliverable</b>: a TCO calculator you can keep&nbsp;updating as data changes.</span></p>
<h2><span lang="EN-US">7. Vendor Lock‑In &amp; Roadmap Control: How Much Flexibility<br>Do You Need?</span></h2>
<p><span lang="EN-US">Open source gives you architectural&nbsp;freedom. SaaS gives you speed but ties you to someone else’s roadmap and&nbsp;pricing. Sometimes that’s fine; sometimes it’s a risk.</span></p>
<p><span lang="EN-US">Map likely IAM needs for 2–3 years. How&nbsp;critical is it to add custom flows quickly or hold back an upgrade? Could&nbsp;pricing shifts hurt you?</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><b>Red flag</b>: &#8216;we’ll never need to extend&#8217;.<br>Organizations evolve and regulations shift.</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US"><b>Deliverable</b>: a risk&nbsp;matrix—flexibility/control vs speed/convenience—plotting Keycloak, SaaS and&nbsp;Hybrid for your case.</span></p>
<p><span lang="EN-US">&nbsp;</span></p>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-3ff8df0 e-flex e-con-boxed e-con e-parent" data-id="3ff8df0" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-160dc54 elementor-widget elementor-widget-text-editor" data-id="160dc54" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h1><span lang="EN-US">A Visual Decision Flow</span></h1><p> </p><p class="MsoNormal"><span lang="EN-US">If your team prefers a diagram to spark discussion, start with the simplified flow below. It nudges you toward Keycloak, SaaS or Hybrid based on the dominant answers. Use it as an icebreaker, not as a final verdict.</span></p>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-f7741db e-flex e-con-boxed e-con e-parent" data-id="f7741db" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-19caa3f elementor-widget elementor-widget-image" data-id="19caa3f" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" data-attachment-id="8083" data-permalink="https://inero-software.com/keycloak-or-saas-idp-a-tech-leaders-guide-to-making-the-right-iam-choice/decisionflowdiagram/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/07/DecisionFlowDiagram-scaled.png" data-orig-size="2560,1972" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="DecisionFlowDiagram" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/07/DecisionFlowDiagram-300x231.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/07/DecisionFlowDiagram-1030x794.png" tabindex="0" role="button" width="768" height="592" src="https://inero-software.com/wp-content/uploads/2025/07/DecisionFlowDiagram-768x592.png" class="attachment-medium_large size-medium_large wp-image-8083" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/07/DecisionFlowDiagram-768x592.png 768w, https://inero-software.com/wp-content/uploads/2025/07/DecisionFlowDiagram-300x231.png 300w, https://inero-software.com/wp-content/uploads/2025/07/DecisionFlowDiagram-1030x794.png 1030w, https://inero-software.com/wp-content/uploads/2025/07/DecisionFlowDiagram-1536x1183.png 1536w, https://inero-software.com/wp-content/uploads/2025/07/DecisionFlowDiagram-2048x1578.png 2048w, https://inero-software.com/wp-content/uploads/2025/07/DecisionFlowDiagram-389x300.png 389w" sizes="(max-width: 768px) 100vw, 768px" data-attachment-id="8083" data-permalink="https://inero-software.com/keycloak-or-saas-idp-a-tech-leaders-guide-to-making-the-right-iam-choice/decisionflowdiagram/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/07/DecisionFlowDiagram-scaled.png" data-orig-size="2560,1972" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="DecisionFlowDiagram" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/07/DecisionFlowDiagram-300x231.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/07/DecisionFlowDiagram-1030x794.png" role="button" />													</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-eafdc58 e-flex e-con-boxed e-con e-parent" data-id="eafdc58" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-99e0a6e elementor-widget elementor-widget-text-editor" data-id="99e0a6e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h1><span lang="EN-US">Quantify It: The Scorecard</span></h1><p class="MsoNormal"><span lang="EN-US">To make debates objective, translate the seven questions into numbers. Give each one a score from 1 to 5 (5 means a strong push toward Keycloak). Totals near the high end suggest Keycloak or Hybrid; lower totals suggest SaaS. More important than the number is the conversation it forces: why did we give compliance a 5 but ops capacity a 2?</span></p><table class="MsoNormalTable" style="border-width: initial; border-style: none;" border="1" cellspacing="0" cellpadding="0"><tbody><tr><td style="width: 108pt; padding: 0cm 5.4pt; border: 1pt solid windowtext;" valign="top" width="144"><h5><span lang="EN-US"><b>Question</b></span></h5></td><td style="width: 108pt; border-top: 1pt solid windowtext; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-left-width: initial; border-left-style: none; padding: 0cm 5.4pt;" valign="top" width="144"><h5><span lang="EN-US"><b>Score (1–5)</b></span></h5></td><td style="width: 108pt; border-top: 1pt solid windowtext; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-left-width: initial; border-left-style: none; padding: 0cm 5.4pt;" valign="top" width="144"><h5><span lang="EN-US"><b>Notes</b></span></h5></td><td style="width: 108pt; border-top: 1pt solid windowtext; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-left-width: initial; border-left-style: none; padding: 0cm 5.4pt;" valign="top" width="144"><h5><span lang="EN-US"><b>Leaning</b></span></h5></td></tr><tr><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-left: 1pt solid windowtext; border-top-width: initial; border-top-style: none; padding: 0cm 5.4pt;" valign="top" width="144"><pre><span lang="EN-US">Compliance &amp; Risk: Do You Need Full Control Over IAM?</span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-left: 1pt solid windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td></tr><tr><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-left: 1pt solid windowtext; border-top-width: initial; border-top-style: none; padding: 0cm 5.4pt;" valign="top" width="144"><pre><span lang="EN-US">Integration Map: How Many Apps and Protocols Today—and in Two Years?</span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td></tr><tr><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-left: 1pt solid windowtext; border-top-width: initial; border-top-style: none; padding: 0cm 5.4pt;" valign="top" width="144"><pre><span lang="EN-US">Team &amp; Operations Capacity: Can You Secure and Run It 24/7 (or Outsource)?</span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td></tr><tr><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-left: 1pt solid windowtext; border-top-width: initial; border-top-style: none; padding: 0cm 5.4pt;" valign="top" width="144"><pre><span lang="EN-US">Customization Needs: Themes, Extensions and Advanced Authorization</span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td></tr><tr><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-left: 1pt solid windowtext; border-top-width: initial; border-top-style: none; padding: 0cm 5.4pt;" valign="top" width="144"><pre><span lang="EN-US">Scalability &amp; High Availability: What Are Your Peak Loads and DR Needs?</span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td></tr><tr><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-left: 1pt solid windowtext; border-top-width: initial; border-top-style: none; padding: 0cm 5.4pt;" valign="top" width="144"><pre><span lang="EN-US">Budget &amp; TCO: What Does Three Years Really Cost vs SaaS?</span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td></tr><tr><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-left: 1pt solid windowtext; border-top-width: initial; border-top-style: none; padding: 0cm 5.4pt;" valign="top" width="144"><pre><span lang="EN-US">Vendor Lock‑In &amp; Roadmap Control: How Much Flexibility Do You Need?</span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"> </span></pre></td></tr><tr><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-left: 1pt solid windowtext; border-top-width: initial; border-top-style: none; padding: 0cm 5.4pt;" valign="top" width="144"><pre><span lang="EN-US"><b>Total / Recommendation</b></span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"><b> </b></span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"><b> </b></span></pre></td><td style="width: 108pt; border-right: 1pt solid windowtext; border-bottom: 1pt solid windowtext; border-bottom-color: windowtext; border-right-color: windowtext; padding: 0cm 5.4pt; border-width: initial 1pt 1pt initial;" valign="top" width="144"><pre><span lang="EN-US"><b>Keycloak / SaaS / Hybrid</b></span></pre></td></tr></tbody></table>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-044e606 e-flex e-con-boxed e-con e-parent" data-id="044e606" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-a55fec5 elementor-widget elementor-widget-text-editor" data-id="a55fec5" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h1> </h1><h1 style="font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal;">From Decision to Deployment: A Pragmatic Pipeline</h1><p style="font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; font-size: 14px; font-family: Roboto, sans-serif;">Assuming Keycloak is the direction, you still need a process to avoid chaos. We recommend a pipeline that mirrors proven delivery patterns: Discovery → Assessment → Architecture → PoC → Pilot → Production → Operate. Each phase ends with a clear artifact and go/no‑go gate.</p><h1><img loading="lazy" decoding="async" data-attachment-id="8094" data-permalink="https://inero-software.com/keycloak-or-saas-idp-a-tech-leaders-guide-to-making-the-right-iam-choice/oragmatic-pipeline/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/07/Oragmatic-Pipeline.png" data-orig-size="1200,246" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Oragmatic Pipeline" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/07/Oragmatic-Pipeline-300x62.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/07/Oragmatic-Pipeline-1030x211.png" tabindex="0" role="button" class="aligncenter wp-image-8094 size-large" src="https://inero-software.com/wp-content/uploads/2025/07/Oragmatic-Pipeline-1030x211.png" alt="" width="1030" height="211" srcset="https://inero-software.com/wp-content/uploads/2025/07/Oragmatic-Pipeline-1030x211.png 1030w, https://inero-software.com/wp-content/uploads/2025/07/Oragmatic-Pipeline-300x62.png 300w, https://inero-software.com/wp-content/uploads/2025/07/Oragmatic-Pipeline-768x157.png 768w, https://inero-software.com/wp-content/uploads/2025/07/Oragmatic-Pipeline.png 1200w" sizes="(max-width: 1030px) 100vw, 1030px" /></h1><p>Discovery clarifies drivers, constraints and stakeholders. Without this, technical work drifts. Assessment inventories integrations and compliance needs, and identifies risks and skill gaps.Architecture produces the reference design, HA/DR plan and governance model. PoC attacks the riskiest assumptions first—often a tricky integration or compliance requirement. Pilot rolls out to a subset of apps/users to validate processes, comms and support.</p><p>Production rollout happens in phases with rollback strategies (blue/green, canary).</p><p>Operate means continuous monitoring, patching, upgrades and cost optimization—often where a partner can help your team breathe.</p><p> </p>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-17d764e e-flex e-con-boxed e-con e-parent" data-id="17d764e" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-9b32f71 elementor-widget elementor-widget-text-editor" data-id="9b32f71" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h1>Next Steps</h1><p>If your scorecard favors Keycloak, schedule a Discovery &amp; Governance workshop to align stakeholders, draft a high‑level architecture and turn assumptions into a roadmap. If you’re unsure, run a PoC targeting the top two risks. And if SaaS seems better today, design an exit strategy anyway—lock‑in is fine when it’s deliberate, not accidental.</p><p> </p>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-fb6022e e-flex e-con-boxed e-con e-parent" data-id="fb6022e" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-e06c810 elementor-widget elementor-widget-text-editor" data-id="e06c810" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h1>&nbsp;Ready to Validate Your Choice?</h1>
<p><span lang="EN-US"><a href="https://calendar.app.google/saTsdh7e5G3YqMQD7" target="_blank">Book a free 45‑minute Keycloak Readiness Consultation</a>. We’ll go through the seven questions together, fill out the scorecard and outline concrete next steps—whether that’s an internal PoC, a hybrid approach or a full advisory engagement.</span></p>
<p><span lang="EN-US">&nbsp;</span></p>						</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-15aa28d e-flex e-con-boxed e-con e-parent" data-id="15aa28d" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-bea0396 elementor-widget elementor-widget-text-editor" data-id="bea0396" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h1>FAQ</h1><p><strong>Is Keycloak free to use in production?</strong></p><p>Yes. The software is open source, but production‑grade IAM still requires infrastructure, operations and security work. Some organizations use managed Keycloak or a consulting partner to offload that burden.</p><p><strong>How long does a typical Keycloak deployment take?</strong></p><p>A focused PoC can be done in weeks. Larger rollouts with dozens of integrations and strict compliance tend to span several months from assessment to stable production.</p><p><strong>Can Keycloak meet NIS2/GDPR requirements?</strong></p><p>Technically yes—Keycloak offers detailed logging, fine‑grained policies and MFA, and can be hosted where you need it. Compliance still depends on governance and evidence, not just tool capabilities.</p>						</div>
				</div>
					</div>
				</div>
				</div>
		<p>Artykuł <a href="https://inero-software.com/keycloak-or-saas-idp-a-tech-leaders-guide-to-making-the-right-iam-choice/">Keycloak or SaaS IdP? A Tech Leader’s Guide to Making the Right IAM Choice</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">8063</post-id>	</item>
		<item>
		<title>Keycloak: Smart Tips for Monitoring and Protection with Built-in Configuration Tools</title>
		<link>https://inero-software.com/monitoring-and-securing-keycloak-performance-and-phishing-attack-protection/</link>
		
		<dc:creator><![CDATA[Marceli Formela]]></dc:creator>
		<pubDate>Thu, 26 Sep 2024 09:51:23 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Keycloak]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=6146</guid>

					<description><![CDATA[<p>Keycloak is not just a powerful identity and access management tool; it&#8217;s also essential for monitoring performance and enhancing security, particularly when defending against phishing attacks. With its built-in monitoring and alerting mechanisms, administrators can detect suspicious user activities and maintain optimal system performance. Andrzej Chybicki CEO Inero Software Keycloak&#8230;</p>
<p>Artykuł <a href="https://inero-software.com/monitoring-and-securing-keycloak-performance-and-phishing-attack-protection/">Keycloak: Smart Tips for Monitoring and Protection with Built-in Configuration Tools</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="6146" class="elementor elementor-6146" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-f4346b3 e-flex e-con-boxed e-con e-parent" data-id="f4346b3" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-e560d78 elementor-widget elementor-widget-html" data-id="e560d78" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-9788065 e-flex e-con-boxed e-con e-parent" data-id="9788065" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-6852513 e-con-full e-flex e-con e-child" data-id="6852513" data-element_type="container">
				</div>
		<div class="elementor-element elementor-element-1457fdd e-con-full e-flex e-con e-child" data-id="1457fdd" data-element_type="container">
				<div class="elementor-element elementor-element-e1ddbe6 elementor-widget elementor-widget-text-editor" data-id="e1ddbe6" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4><span class="TextRun SCXW108935395 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SpellingErrorV2Themed SCXW108935395 BCX0">Keycloak</span><span class="NormalTextRun SCXW108935395 BCX0"> is not just a powerful identity and access management tool; </span><span class="NormalTextRun SCXW108935395 BCX0">it&#8217;s</span><span class="NormalTextRun SCXW108935395 BCX0"> also essential for </span><span class="NormalTextRun SCXW108935395 BCX0">monitoring</span><span class="NormalTextRun SCXW108935395 BCX0"> performance and enhancing security, particularly when defending against phishing attacks. With its built-in monitoring and alerting mechanisms, administrators can detect suspicious user activities and </span><span class="NormalTextRun SCXW108935395 BCX0">maintain</span> <span class="NormalTextRun SCXW108935395 BCX0">optimal</span><span class="NormalTextRun SCXW108935395 BCX0"> system performance.</span></span><span class="EOP SCXW108935395 BCX0" data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></h4>						</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-0bdde1b e-flex e-con-boxed e-con e-parent" data-id="0bdde1b" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-0660a51 e-con-full e-flex e-con e-child" data-id="0660a51" data-element_type="container">
		<div class="elementor-element elementor-element-b9fde1c e-con-full e-flex e-con e-child" data-id="b9fde1c" data-element_type="container">
				</div>
				<div class="elementor-element elementor-element-932c0ac elementor-widget__width-initial elementor-widget elementor-widget-link-in-bio" data-id="932c0ac" data-element_type="widget" data-widget_type="link-in-bio.default">
				<div class="elementor-widget-container">
					<div class="e-link-in-bio e-link-in-bio">
			<div class="e-link-in-bio__content">

						<div class="e-link-in-bio__identity">
									<div class="e-link-in-bio__identity-image e-link-in-bio__identity-image-profile has-style-circle">
							<img loading="lazy" decoding="async" width="300" height="300" src="https://inero-software.com/wp-content/uploads/2024/06/Andrzej-Chybicki-PhD-Eng.-1-300x300.png" class="e-link-in-bio__identity-image-element" alt="" srcset="https://inero-software.com/wp-content/uploads/2024/06/Andrzej-Chybicki-PhD-Eng.-1-300x300.png 300w, https://inero-software.com/wp-content/uploads/2024/06/Andrzej-Chybicki-PhD-Eng.-1-1030x1030.png 1030w, https://inero-software.com/wp-content/uploads/2024/06/Andrzej-Chybicki-PhD-Eng.-1-80x80.png 80w, https://inero-software.com/wp-content/uploads/2024/06/Andrzej-Chybicki-PhD-Eng.-1-768x768.png 768w, https://inero-software.com/wp-content/uploads/2024/06/Andrzej-Chybicki-PhD-Eng.-1-75x75.png 75w, https://inero-software.com/wp-content/uploads/2024/06/Andrzej-Chybicki-PhD-Eng.-1-50x50.png 50w, https://inero-software.com/wp-content/uploads/2024/06/Andrzej-Chybicki-PhD-Eng.-1-512x512.png 512w, https://inero-software.com/wp-content/uploads/2024/06/Andrzej-Chybicki-PhD-Eng.-1-1024x1024.png 1024w, https://inero-software.com/wp-content/uploads/2024/06/Andrzej-Chybicki-PhD-Eng.-1.png 1200w" sizes="(max-width: 300px) 100vw, 300px" data-attachment-id="5903" data-permalink="https://inero-software.com/?attachment_id=5903" data-orig-file="https://inero-software.com/wp-content/uploads/2024/06/Andrzej-Chybicki-PhD-Eng.-1.png" data-orig-size="1200,1200" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Andrzej Chybicki PhD Eng. (1)" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/06/Andrzej-Chybicki-PhD-Eng.-1-300x300.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/06/Andrzej-Chybicki-PhD-Eng.-1-1030x1030.png" tabindex="0" role="button" />													</div>
							</div>
					<div class="e-link-in-bio__bio">
								<h3 class="e-link-in-bio__title">Andrzej Chybicki </h3>								<p class="e-link-in-bio__description">CEO Inero Software      
</p>			</div>
					<div class="e-link-in-bio__icons has-size-small">
							<div class="e-link-in-bio__icon is-size-small">
					<a href="https://www.linkedin.com/in/andrzej-chybicki/" target="_blank" rel="noopener " aria-label="LinkedIn" class="e-link-in-bio__icon-link">
						<span class="e-link-in-bio__icon-svg">
							<svg aria-hidden="true" class="e-font-icon-svg e-fab-linkedin-in" viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><path d="M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z"></path></svg>						</span>
											</a>
				</div>
					</div>
		
		<div class="e-link-in-bio__ctas has-type-button">
							<a href="https://inero-software.com/keycloak-services/" target="_blank" rel="noopener " class="e-link-in-bio__cta is-type-button has-corners-rounded">
										<span class="e-link-in-bio__cta-text">
						Keycloak services.  Comprehensive implementation, maintenance, and training					</span>
				</a>
					</div>
		
			</div>
			<div class="e-link-in-bio__bg">
				<div class="e-link-in-bio__bg-overlay"></div>
			</div>
		</div>
				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-966c713 e-con-full e-flex e-con e-child" data-id="966c713" data-element_type="container">
				<div class="elementor-element elementor-element-369c446 elementor-widget elementor-widget-text-editor" data-id="369c446" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4><b><span data-contrast="auto">Keycloak Performance: Monitoring with Grafana</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></h4><p><span data-contrast="auto">Monitoring Keycloak’s performance is crucial, especially in large organizations where the system needs to handle thousands of users simultaneously. Interesting tools to use in this regard if for instance </span><b><span data-contrast="auto">aerogear</span></b><span data-contrast="auto"> (</span><a href="https://github.com/aerogear/keycloak-metrics-spi"><span data-contrast="none">https://github.com/aerogear/keycloak-metrics-spi</span></a><span data-contrast="auto">). Aeorgear allows for easy trackick of critical metrics in real-time, allowing for system optimization and scaling.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p><p><span data-contrast="auto">Aerogear provides two key functions: </span><b><span data-contrast="auto">MetricsEventListener</span></b><span data-contrast="auto"> and </span><b><span data-contrast="auto">MetricsEndpoint</span></b><span data-contrast="auto">, which enable the forwarding of Keycloak events to Prometheus and integration with visualization tools like Grafana. This allows administrators to monitor important metrics, such as:</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>						</div>
				</div>
				<div class="elementor-element elementor-element-ffa0c9b elementor-widget elementor-widget-text-editor" data-id="ffa0c9b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<ul><li style="list-style-type: none;"><ul><li data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><p><span style="color: #800080;">Memory usage, </span></p></li></ul></li></ul><ul><li style="list-style-type: none;"><ul><li data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="2" data-aria-level="1"><p><span style="color: #800080;">Number of logged-in users (by realm, client, globally, etc.), </span></p></li></ul></li></ul><ul><li style="list-style-type: none;"><ul><li data-leveltext="" data-font="Symbol" data-listid="1" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="3" data-aria-level="1"><p><span style="color: #800080;">Login errors. </span></p></li></ul></li></ul>						</div>
				</div>
				<div class="elementor-element elementor-element-e5f2273 elementor-widget elementor-widget-text-editor" data-id="e5f2273" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><span class="TextRun SCXW231539065 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW231539065 BCX0">Grafana offers </span><span class="NormalTextRun SCXW231539065 BCX0">a high level</span><span class="NormalTextRun SCXW231539065 BCX0"> of customization, allowing the inclusion of custom parameters (e.g., from CSV files or databases) and setting up alerts. These alerts can be triggered by </span><span class="NormalTextRun SCXW231539065 BCX0">various factors</span><span class="NormalTextRun SCXW231539065 BCX0">, such as:</span></span><span class="EOP SCXW231539065 BCX0" data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>						</div>
				</div>
				<div class="elementor-element elementor-element-1e9ba12 elementor-widget elementor-widget-text-editor" data-id="1e9ba12" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<ul><li style="list-style-type: none;"><ul><li data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="1" data-aria-level="1"><span style="color: #800080;">Exceeding login time limits, </span></li></ul></li></ul><ul><li style="list-style-type: none;"><ul><li data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="2" data-aria-level="1"><span style="color: #800080;">Logging in from unauthorized locations, </span></li></ul></li></ul><ul><li style="list-style-type: none;"><ul><li data-leveltext="" data-font="Symbol" data-listid="2" data-list-defn-props="{&quot;335552541&quot;:1,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&quot;,&quot;469777815&quot;:&quot;multilevel&quot;}" aria-setsize="-1" data-aria-posinset="3" data-aria-level="1"><span style="color: #800080;">Unusual numbers of password reset requests. </span></li></ul></li></ul>						</div>
				</div>
				<div class="elementor-element elementor-element-5e9160a elementor-widget elementor-widget-image" data-id="5e9160a" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" data-attachment-id="6148" data-permalink="https://inero-software.com/monitoring-and-securing-keycloak-performance-and-phishing-attack-protection/grafana/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/09/grafana.png" data-orig-size="1263,1000" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="grafana" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/09/grafana-300x238.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/09/grafana-1030x816.png" tabindex="0" role="button" width="1030" height="816" src="https://inero-software.com/wp-content/uploads/2024/09/grafana-1030x816.png" class="attachment-large size-large wp-image-6148" alt="" srcset="https://inero-software.com/wp-content/uploads/2024/09/grafana-1030x816.png 1030w, https://inero-software.com/wp-content/uploads/2024/09/grafana-300x238.png 300w, https://inero-software.com/wp-content/uploads/2024/09/grafana-768x608.png 768w, https://inero-software.com/wp-content/uploads/2024/09/grafana-379x300.png 379w, https://inero-software.com/wp-content/uploads/2024/09/grafana-380x300.png 380w, https://inero-software.com/wp-content/uploads/2024/09/grafana.png 1263w" sizes="(max-width: 1030px) 100vw, 1030px" data-attachment-id="6148" data-permalink="https://inero-software.com/monitoring-and-securing-keycloak-performance-and-phishing-attack-protection/grafana/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/09/grafana.png" data-orig-size="1263,1000" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="grafana" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/09/grafana-300x238.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/09/grafana-1030x816.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-7544641 elementor-widget elementor-widget-text-editor" data-id="7544641" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h6><span class="TextRun SCXW154526738 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW154526738 BCX0">Figure 1. Source: grafana.com/</span><span class="NormalTextRun SpellingErrorV2Themed SCXW154526738 BCX0">grafana</span><span class="NormalTextRun SCXW154526738 BCX0">/dashboards/10441-keycloak-metrics-dashboard</span></span><span class="EOP SCXW154526738 BCX0" data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></h6>						</div>
				</div>
				<div class="elementor-element elementor-element-8670612 elementor-widget elementor-widget-text-editor" data-id="8670612" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4><b><span data-contrast="auto">Phishing Attack Protection: Adaptive Authentication Mechanisms</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></h4><p><span data-contrast="auto">In addition to performance monitoring, Keycloak’s advanced built-in security features help protect against phishing attacks by analyzing event patterns. Keycloak events allow administrators to define custom responses to specific user actions, such as password resets following failed login attempts—often an indicator of phishing activity.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p><p><span data-contrast="auto">An example of a security feature is </span><b><span data-contrast="auto">adaptive authentication</span></b><span data-contrast="auto">, which modifies the user login flow based on previous behavior. For instance, if a user requests a password reset without recent failed login attempts, the system could trigger an additional authentication step, like two-factor authentication (2FA).</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>						</div>
				</div>
				<div class="elementor-element elementor-element-72d0a10 elementor-widget elementor-widget-text-editor" data-id="72d0a10" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4><b><span data-contrast="auto">Creating and adapting Security Policy</span></b><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></h4><p><span data-contrast="auto">When implementing these features, it’s essential to determine when user actions should raise suspicion. For example, a password reset without failed login attempts might signal phishing, while a reset after multiple failed logins is more routine. A custom security policy could be defined to say: </span><i><span data-contrast="auto">“If a user requests a password reset without failed logins in the last 3 minutes, require 2FA.”</span></i><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p><p><span data-contrast="auto">These adaptive authentication mechanisms reduce the burden of MFA (multi-factor authentication) while maintaining high security levels. By configuring Keycloak’s event and alert system, organizations can more effectively detect unusual behavior and respond to potential threats more swiftly.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p><p><span data-contrast="auto">Keycloak is a versatile tool that supports both performance monitoring and enhanced security. Integration with tools like Grafana allows administrators to keep track of essential system parameters, while advanced event-based mechanisms and adaptive authentication enhance security by protecting against phishing and other threats. Proper configuration of these features can significantly boost security and improve incident response times.</span><span data-ccp-props="{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}"> </span></p>						</div>
				</div>
				</div>
					</div>
				</div>
				</div>
		<p>Artykuł <a href="https://inero-software.com/monitoring-and-securing-keycloak-performance-and-phishing-attack-protection/">Keycloak: Smart Tips for Monitoring and Protection with Built-in Configuration Tools</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6146</post-id>	</item>
		<item>
		<title>Challenges and Benefits of Integrating Keycloak: Compliance with the NIS 2 Directive and Practical Implementation Advice</title>
		<link>https://inero-software.com/challenges-and-benefits-of-integrating-keycloak-compliance-with-the-nis-2-directive-and-practical-implementation-advice/</link>
		
		<dc:creator><![CDATA[Marta Kuprasz]]></dc:creator>
		<pubDate>Tue, 16 Jul 2024 08:18:41 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[IAM]]></category>
		<category><![CDATA[keycloak]]></category>
		<category><![CDATA[NIS 2 Directive]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=6007</guid>

					<description><![CDATA[<p>Artykuł <a href="https://inero-software.com/challenges-and-benefits-of-integrating-keycloak-compliance-with-the-nis-2-directive-and-practical-implementation-advice/">Challenges and Benefits of Integrating Keycloak: Compliance with the NIS 2 Directive and Practical Implementation Advice</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="row"><div class="col-sm-1"></div><div class="col-sm-10">
<p>&nbsp;</p>
<h4>The widespread digitalization of services is leading to an increasing amount of resources being moved to the cloud. While this approach brings numerous benefits, including flexibility and scalability, it also exposes these services externally, increasing the risk of unauthorized access. Managing access to cloud resources is becoming an increasingly significant challenge, especially in large organizations that operate with a growing number of users, contractors, and a diversity of roles and permissions.</h4>
<p>This process has attracted the attention of the global community, which emphasizes the importance of tailoring secure practices to the specific needs of individual companies and the sectors in which they operate through guidelines and directives. Directive 2022/2555, known as the NIS 2 Directive, is the European Union&#8217;s response to these changes and the need to introduce a uniform set of information security obligations and standards across member countries. The main obligations arising from the directive include:</p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>The obligation to implement risk management measures and incident response protocols</li>
<li>The obligation to report significant cybersecurity incidents to the relevant authorities.</li>
<li>The requirement for cooperation between member states and with relevant authorities at the EU level.</li>
<li>Dedicated requirements for key sectors such as energy, transport, health, and finance.</li>
</ul>
</li>
</ul>
<h3>What Will Change with the NIS 2 Directive</h3>
<p>The new regulations have extended coverage to more sectors and a larger number of organizations, including medium and large enterprises in critical industries. Stricter requirements for information security and reporting obligations have been introduced to increase resilience to cyber threats. According to Article 21, paragraph 3, companies are required to verify the overall quality of their suppliers&#8217; and service providers&#8217; cybersecurity products and practices, including their secure development procedures.</p>
<p>In the report &#8220;Foresight Cybersecurity Threats for 2030,&#8221; ENISA (European Union Agency for Cybersecurity) presented a detailed analysis of emerging cybersecurity threats up to the year 2030. Analysts identified the following key threats:</p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>Disruption of the software supply chain</li>
<li>Shortage of skilled cybersecurity specialists</li>
<li>Human errors and exploitation of legacy system</li>
</ul>
</li>
</ul>
<p>The latest reports on software supply chain security confirm that it is one of the biggest threats to cybersecurity. The report &#8220;The State of Software Supply Chain Security 2024&#8221; from ReversingLabs indicates that the number of attacks on the software supply chain has increased by 289% over the past four years, with most attacks concentrated on popular open-source repositories such as npm and PyPI​.</p>
<p>In the ENISA publication, the danger associated with the growing dependence of key economic sectors on external IT services is also highlighted. This dependence can lead to an increased number of interactions in the digital landscape. As a result, key service providers are gradually becoming dependent on software whose development process is neither certified nor managed.</p>
<p>&nbsp;</p>
<h3>How to Ensure IT Solutions Compliance with the NIS 2 Directive</h3>
<p>NIS 2 is a fairly general directive and does not explicitly state what actions to take or what steps to follow. Nevertheless, it sets a direction for cybersecurity measures, highlighting the following key actions:</p>
<ul>
<li>Ensuring uniform and verified authorized access to digital services, especially those processing personal data.</li>
<li>Implementing continuous monitoring and security updates within enterprises for critical service access points.</li>
<li>Standardizing access processes to digital services along with implementing a user identity management system.</li>
<li>Reporting and monitoring the status of access to authorized services and data collections.</li>
</ul>
<p>&nbsp;</p>
<p><strong>For this reason, we can expect an increase in interest in implementing IAM (Identity and Access Management) solutions in the near future. The primary issue is not only the implementation of the IAM system itself but also the ability to adapt it to the specific integration needs of various solutions:</strong></p>
<ul>
<li><strong>SSO with Keycloak</strong> – Significantly simplifies the authentication and authorization process within organizations, improving user convenience and system security. With single sign-on, users can more efficiently utilize different applications, thereby increasing productivity.</li>
<li><strong>Event Logging and Alerts</strong> – Keycloak logs various events such as logins, password changes, authentication errors, and system configuration modifications. Alerts help in rapid threat response, minimizing security breach risks and enhancing cloud resource protection.</li>
<li><strong>Custom Authorization Flow in Keycloak</strong> – Allows for the creation of custom authentication and authorization processes tailored to the specific requirements of an organization. The need for this solution arises from the necessity to provide flexibility and security in managing access to resources.</li>
<li><strong>Identity Providers</strong> – Integrating Keycloak with Microsoft Active Directory (AD) and Google Workspace enables central identity and access management. This allows users to utilize single sign-on (SSO), gaining access to multiple applications with one set of credentials.</li>
<li><strong>Scaling Keycloak</strong> – Allows handling a growing number of users and applications by running multiple instances in a clustered configuration, ensuring even load distribution and high availability.</li>
</ul>
<h3><a href="https://inero-software.com/custom-sms-authenticator-with-keycloak/"><img loading="lazy" decoding="async" data-attachment-id="5974" data-permalink="https://inero-software.com/enhancing-identity-management-with-keycloak-user-federations/banery-inero2606/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/06/banery-inero2606.png" data-orig-size="1200,100" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="banery inero2606" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/06/banery-inero2606-300x25.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/06/banery-inero2606-1030x86.png" tabindex="0" role="button" class="alignnone wp-image-5974 size-full" src="https://inero-software.com/wp-content/uploads/2024/06/banery-inero2606.png" alt="" width="1200" height="100" srcset="https://inero-software.com/wp-content/uploads/2024/06/banery-inero2606.png 1200w, https://inero-software.com/wp-content/uploads/2024/06/banery-inero2606-300x25.png 300w, https://inero-software.com/wp-content/uploads/2024/06/banery-inero2606-1030x86.png 1030w, https://inero-software.com/wp-content/uploads/2024/06/banery-inero2606-768x64.png 768w" sizes="(max-width: 1200px) 100vw, 1200px" /></a></h3>
<h3>How to Prepare for a Discussion on Implementing Keycloak in a Large Organization?</h3>
<p>Technical discussions about implementing new tools can be lengthy and multi-staged, so it is essential to prepare properly to ensure the consultation phase proceeds quickly and both parties obtain sufficient information. We asked our CEO, Andrzej Chybicki, for advice on how to best prepare for implementing Keycloak.</p>
<p>&nbsp;</p>
<h5>WHAT ARE THE MOST COMMON NEEDS OF COMPANIES SEEKING CYBERSECURITY COLLABORATION?</h5>
<p>Keycloak is a specific yet comprehensive solution that allows for the creation of advanced user authorization management systems. Its biggest advantage is the possibility of implementing it as on-premise software.</p>
<p>Even companies with extensive experience can face challenges when introducing a significant change such as a custom authorization flow in their login systems and often seek consultation. In such situations, they look for partners who have practical experience in similar projects, are familiar with common problems, and have proven methods for solving them.</p>
<p>Our clients include organizations at various levels of IAM experience – some are considering implementation, aware of the benefits of identity and access management but unsure where to start. Others have already begun implementation and installed necessary components but face challenges in configuring customization for users, partners, and employees, for instance, in designing complex authorization schemes required by their operations.</p>
<p>&nbsp;</p>
<h5>HOW TO PREPARE FOR THE IMPLEMENTATION OF KEYCLOAK TO ENSURE A SMOOTH PROCESS?</h5>
<p>When helping companies create internal IAM solutions, our actions lead to two fundamental questions. First, it is essential to assess whether Keycloak, compared to other solutions like Okta or AWS Cognito, which might offer simpler handling and cloud-level automation, is the best choice. Then, it becomes crucial to outline authorization processes, application integration, installation type (on-demand or on-premise), technical support, and long-term strategy with system updates. These are the basic issues to discuss at the outset.</p>
<p>&nbsp;</p>
<h5>WHAT DO CLIENTS EXPECT FROM US AS A COMPANY COMPREHENSIVELY IMPLEMENTING KEYCLOAK?</h5>
<p>Our experience shows that the greatest help for our partners is the specialized knowledge gained from similar initiatives. They often seek experts when they have specific requirements for customizing production software or need to create an add-on (plugin). They expect our support, counting on us to use experiences from previous projects and show how we handled similar challenges in the past. Examples range from ensuring scalability, configuring and integrating with cloud authorization flows to integrating with database systems handling millions of users simultaneously. Our task is to provide advisory services that meet their essential needs.</p>
<p>&nbsp;</p>
<h5>WE&#8217;VE IMPLEMENTED KEYCLOAK, BUT WHAT NEXT? DOES THE COMPANY NEED TO HIRE DEVELOPERS FAMILIAR WITH THIS TOOL TO MANAGE THE SYSTEM POST-IMPLEMENTATION?</h5>
<p>The process of implementing and configuring Keycloak is complex, and the intensity of work during the project is not even. Such work is often overseen by the security department or individuals at the chief technical management level – thus requiring coordination among multiple employee groups. Coordination with support teams is also often needed to determine the optimal time to introduce changes in authorization processes.</p>
<p>Implementing Keycloak does not require the constant presence of dedicated experts within the organization. Keycloak is generally a stable tool, and it is crucial for system managers to know how it functions and to be able to operate Keycloak&#8217;s administrative panel, utilizing its features without the need for modification.</p>
<p>However, long-term support is essential, including regular security updates that the Keycloak community releases every few months. These updates are critical, and it is valuable to have access to skills and knowledge in case of critical issues.</p>
<p><a href="https://inero-software.com/keycloak-services/"><img loading="lazy" decoding="async" data-attachment-id="6008" data-permalink="https://inero-software.com/challenges-and-benefits-of-integrating-keycloak-compliance-with-the-nis-2-directive-and-practical-implementation-advice/banery-16072024en-inero/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/07/banery-16072024en-inero.png" data-orig-size="1200,100" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="banery 16072024en inero" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/07/banery-16072024en-inero-300x25.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/07/banery-16072024en-inero-1030x86.png" tabindex="0" role="button" class="alignnone wp-image-6008 size-full" src="https://inero-software.com/wp-content/uploads/2024/07/banery-16072024en-inero.png" alt="" width="1200" height="100" srcset="https://inero-software.com/wp-content/uploads/2024/07/banery-16072024en-inero.png 1200w, https://inero-software.com/wp-content/uploads/2024/07/banery-16072024en-inero-300x25.png 300w, https://inero-software.com/wp-content/uploads/2024/07/banery-16072024en-inero-1030x86.png 1030w, https://inero-software.com/wp-content/uploads/2024/07/banery-16072024en-inero-768x64.png 768w" sizes="(max-width: 1200px) 100vw, 1200px" /></a></p>
<p>[1] https://www.enisa.europa.eu/publications/foresight-cybersecurity-threats-for-2030-update-2024-extended-report</p>
<p></p></div><div class="col-sm-1"></div></div>
<p>Artykuł <a href="https://inero-software.com/challenges-and-benefits-of-integrating-keycloak-compliance-with-the-nis-2-directive-and-practical-implementation-advice/">Challenges and Benefits of Integrating Keycloak: Compliance with the NIS 2 Directive and Practical Implementation Advice</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6007</post-id>	</item>
		<item>
		<title>Case study: Deploying an AI-based solution at Farm Frites Poland</title>
		<link>https://inero-software.com/case-study-deploying-an-ai-based-solution-at-farm-frites-poland/</link>
		
		<dc:creator><![CDATA[Marta Kuprasz]]></dc:creator>
		<pubDate>Mon, 02 Oct 2023 13:58:59 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Case study]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[Neuronal Networks]]></category>
		<category><![CDATA[optimize the production process]]></category>
		<category><![CDATA[solution]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=5173</guid>

					<description><![CDATA[<p>At Interizon Day 2023 Waldemar Kołub co- founder of Inero Software presented a success story about using Neuronal Networks to optimize the production process. Farm Frites Poland is leading producer of potato products, supplying products to, among others, one of the largest fast-food restaurants in the world. The company has&#8230;</p>
<p>Artykuł <a href="https://inero-software.com/case-study-deploying-an-ai-based-solution-at-farm-frites-poland/">Case study: Deploying an AI-based solution at Farm Frites Poland</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3></h3>
<p>At Interizon Day 2023 Waldemar Kołub co- founder of Inero Software presented a success story about using Neuronal Networks to optimize the production process.</p>
<p><span id="more-5173"></span></p>
<p><img loading="lazy" decoding="async" data-attachment-id="2768" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-08/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Glyph v8" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" tabindex="0" role="button" class=" wp-image-2768 alignleft" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" alt="Paragrapgh icon" width="93" height="93" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w" sizes="(max-width: 93px) 100vw, 93px" />Farm Frites Poland is leading producer of potato products, supplying products to, among others, one of the largest fast-food restaurants in the world. The company has been operating for over 30 years, and its headquarters is located in Lębork. The modern machinery park consists of three production lines.It employs over 270 people, and the quantity of potatoes used for production over a year exceeds 250,000 tons.</p>
<p>&#8220;T<em>he problem our client had was to estimate the production yield based on the parameters of the raw input material, so how much of the final product we can obtain from the given amount of the source material, or, to put it in layman&#8217;s terms, how much fries we can get from a potato. And it turns out that it is not an easy question to answer.</em>&#8221; &#8211;  Waldemar Korłub mentioned at his presentation.</p>
<p>Challenges for the development od the company was:</p>
<h5>DATA OF THE RAW MATERIAL:</h5>
<ul>
<li>Contracting for raw material supplies is planned several months in advance and constitutes a significant element of the enterprise&#8217;s manufacturing process and pricing policy.</li>
<li>Estimation of yield, i.e., the difference between the weight of raw material and the final product expressed in percentages (EPY), allows for adjusting the raw material price to the expected result.</li>
</ul>
<h5>PRODUCTION OPTIMIZATION:</h5>
<ul>
<li>Identification of raw material characteristics that most significantly affect the yield (EPY)?</li>
<li>Indicate what yield can be expected based on the given raw material?</li>
</ul>
<p>&#8220;<em>So there are a lot of parameters that describe the source material. All in all, there are over 40 different physical traits that need to be taken into account that might influence the final. Yield with the set of parameters. We perform exploratory data analysis to find correlations between the parameters and the final results. By doing that, we are able to identify the parameters which influence the final results the most. Also, we looked for correlations between the parameters which allowed for dimensionality reduction in the problem space and, as a result, it allows for speeding up the machine learning process</em>.&#8221;</p>
<p><img loading="lazy" decoding="async" data-attachment-id="5206" data-permalink="https://inero-software.com/case-study-deploying-an-ai-based-solution-at-farm-frites-poland/2-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2023/10/2.png" data-orig-size="5520,2588" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="2" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2023/10/2-300x141.png" data-large-file="https://inero-software.com/wp-content/uploads/2023/10/2-1030x483.png" tabindex="0" role="button" class="wp-image-5206 alignleft" src="https://inero-software.com/wp-content/uploads/2023/10/2-300x141.png" alt="" width="828" height="389" srcset="https://inero-software.com/wp-content/uploads/2023/10/2-300x141.png 300w, https://inero-software.com/wp-content/uploads/2023/10/2-1030x483.png 1030w, https://inero-software.com/wp-content/uploads/2023/10/2-768x360.png 768w, https://inero-software.com/wp-content/uploads/2023/10/2-1536x720.png 1536w, https://inero-software.com/wp-content/uploads/2023/10/2-2048x960.png 2048w, https://inero-software.com/wp-content/uploads/2023/10/2-640x300.png 640w" sizes="(max-width: 828px) 100vw, 828px" /></p>
<p>Machine learning is method used for &#8220;feeding&#8221; machines with data so that based on this data and their own errors, they learn the rules to solve a given problem. It can be assumed that this is a role reversal, where previously, by defining the rules and utilizing the data, we sought answers.</p>
<p><em><span style="text-indent: 0em;">&#8220;With a well-defined set of parameters, we could move on to model research. We&#8217;</span><span style="text-indent: 0em;">ve tested several different machine learning approaches, including regre</span></em><span style="text-indent: 0em;"><em>ssion models, decision trees, support vector machines, and neural networks. In the end, it turned out that the best results were achieved with neural networks, with the mean error at around 1.2% for the validation data.</em>&#8220;</span></p>
<p>&nbsp;</p>
<h5>LEARNING</h5>
<p>Learning is based on providing training examples (historical data) in the form of:</p>
<ul>
<li>Average raw material per run: Green, Rusty, OWG, Color (actual values)</li>
<li>Average yield per run: EPY (e.g., 45%)</li>
</ul>
<p>The network minimizes the error between the actual value of EPY (45%) and what it predicts itself (e.g., 54%). The metric used is MSE (Mean Squared Error).</p>
<h5>IMPLEMENTATION AND VALIDATION</h5>
<p>The model was implemented in the client&#8217;s infrastructure. Thanks to the introduction of the solution, it was possible to minimize the forecast error to just 3%. This means that accurate estimates can already be made at the stage of contracting raw material supplies.</p>
<p>&#8220;<em>This preliminary model research was conducted on a subset of the dataset, and the model that was decided to be the best was later on deployed in our client&#8217;s infrastructure and we performed the full training using the complete set of production data from historical production runs. The final model was deployed to production with the mean squared error below 3% for the real-world production runs.</em>&#8220;</p>
<p><img loading="lazy" decoding="async" data-attachment-id="5220" data-permalink="https://inero-software.com/case-study-deploying-an-ai-based-solution-at-farm-frites-poland/zalaczniki-prezentacja-169/" data-orig-file="https://inero-software.com/wp-content/uploads/2023/10/Zalaczniki-Prezentacja-169.png" data-orig-size="4800,1443" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Załączniki (Prezentacja (169))" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2023/10/Zalaczniki-Prezentacja-169-300x90.png" data-large-file="https://inero-software.com/wp-content/uploads/2023/10/Zalaczniki-Prezentacja-169-1030x310.png" tabindex="0" role="button" class="wp-image-5220 aligncenter" src="https://inero-software.com/wp-content/uploads/2023/10/Zalaczniki-Prezentacja-169-300x90.png" alt="" width="1073" height="322" srcset="https://inero-software.com/wp-content/uploads/2023/10/Zalaczniki-Prezentacja-169-300x90.png 300w, https://inero-software.com/wp-content/uploads/2023/10/Zalaczniki-Prezentacja-169-1030x310.png 1030w, https://inero-software.com/wp-content/uploads/2023/10/Zalaczniki-Prezentacja-169-768x231.png 768w, https://inero-software.com/wp-content/uploads/2023/10/Zalaczniki-Prezentacja-169-1536x462.png 1536w, https://inero-software.com/wp-content/uploads/2023/10/Zalaczniki-Prezentacja-169-2048x616.png 2048w, https://inero-software.com/wp-content/uploads/2023/10/Zalaczniki-Prezentacja-169-998x300.png 998w" sizes="(max-width: 1073px) 100vw, 1073px" /></p>
<p>This solution was developed according to <a href="https://inero-software.com/build-operate-transfer/">our build, operate, transfer model.</a> <em>&#8220;We build the solution using our knowledge and expertise in the first step. Then we helped with setting up the infrastructure and the processes to meet the operational requirements, and finally, the product was transferred to the client, who receives the full ownership of the solution. With this process, we are not only trying to create solutions for individual problems but rather to create a platform for the ongoing development of innovations in the environment of our clients</em>.&#8221;</p>
<p>At Inero Software, we believe that software goes beyond just the technical; it&#8217;s also about people, business, and delivering on sustainable long-term objectives. By leveraging the BOT model, we establish a lasting innovation framework within our client&#8217;s operations, enabling them to set and achieve long-term business goals through the power of innovation.</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" data-attachment-id="64" data-permalink="https://inero-software.com/case-study-deploying-an-ai-based-solution-at-farm-frites-poland/waldemar/" data-orig-file="https://inero-software.com/wp-content/uploads/2018/02/waldemar.png" data-orig-size="308,308" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Waldek_Korlub_Inero_Software_CTO" data-image-description="" data-image-caption="&lt;p&gt;Inero Software Chief Technology Officer&lt;/p&gt;
" data-medium-file="https://inero-software.com/wp-content/uploads/2018/02/waldemar-300x300.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/02/waldemar.png" tabindex="0" role="button" class="wp-image-64 alignleft" src="https://inero-software.com/wp-content/uploads/2018/02/waldemar-300x300.png" alt="" width="217" height="217" srcset="https://inero-software.com/wp-content/uploads/2018/02/waldemar-300x300.png 300w, https://inero-software.com/wp-content/uploads/2018/02/waldemar-80x80.png 80w, https://inero-software.com/wp-content/uploads/2018/02/waldemar-36x36.png 36w, https://inero-software.com/wp-content/uploads/2018/02/waldemar-180x180.png 180w, https://inero-software.com/wp-content/uploads/2018/02/waldemar-120x120.png 120w, https://inero-software.com/wp-content/uploads/2018/02/waldemar.png 308w" sizes="(max-width: 217px) 100vw, 217px" /></p>
<p>Waldemar Korłub, Eng. PhD</p>
<p>CO-FOUNDER INERO SOFTWARE</p>
<p><a href="mailto:waldemar.korlub@inero.pl">waldemar.korlub@inero.pl</a></p>
<p>&nbsp;</p>
<p>Artykuł <a href="https://inero-software.com/case-study-deploying-an-ai-based-solution-at-farm-frites-poland/">Case study: Deploying an AI-based solution at Farm Frites Poland</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5173</post-id>	</item>
		<item>
		<title>Optimization of Data Collection Process Thanks to AI Algorithms</title>
		<link>https://inero-software.com/optimization-of-data-collection-process-thanks-to-ai-algorithms/</link>
		
		<dc:creator><![CDATA[Marta Kuprasz]]></dc:creator>
		<pubDate>Fri, 15 Sep 2023 12:25:38 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[#data]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[AI Algorithms]]></category>
		<category><![CDATA[DocsQuality]]></category>
		<category><![CDATA[documents]]></category>
		<category><![CDATA[Large Language Model]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[Natural Language Processing]]></category>
		<category><![CDATA[NLP]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=5070</guid>

					<description><![CDATA[<p>Optimization of Data Collection Process Thanks to AI Algorithms &#160; In an era of progress and numerous achievements in natural language processing, we see increasing possibilities in the analysis and inference based on data collected in unstructured textual archives and documents. Therefore, streamlining business operations and implementing NLP (Natural Language&#8230;</p>
<p>Artykuł <a href="https://inero-software.com/optimization-of-data-collection-process-thanks-to-ai-algorithms/">Optimization of Data Collection Process Thanks to AI Algorithms</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3></h3>
<h3 style="text-align: center;"><span style="color: #800080;"><strong>Optimization of Data Collection Process Thanks to AI Algorithms</strong></span></h3>
<p>&nbsp;</p>
<p>In an era of progress and numerous achievements in natural language processing, we see increasing possibilities in the analysis and inference based on data collected in unstructured textual archives and documents. Therefore, streamlining business operations and implementing NLP (Natural Language Processing) and LLM (Large Language Models) tools become essential. The digitization of business processes moves many tasks into the virtual world, and controlling and analyzing a large volume of collected data becomes a significant challenge.</p>
<p><span id="more-5070"></span></p>
<h1>Save time</h1>
<p>Of course, time is crucial. In the age of constant haste, laborious analytical tasks requiring focus, precision, and diligence become a burden for efficient and often dispersed teams. The modern business operates swiftly. Many industries, such as accounting, law firms, insurance, or transportation, place significant emphasis on the quality of documentation, which significantly impacts group efficiency.</p>
<p>Let&#8217;s take the transportation sector as an example. TSL companies handle dozens of freight shipments daily, each generating a large amount of documentation, including invoices, contracts, policies, delivery notes, and driver logs. When added to the internal administrative workflow, it&#8217;s easy to overlook an unreadable document (e.g., hastily scanned), which can disrupt the document circulation process at a later stage and require corrections, thus significantly extending the task list. This could affect cash flow. Therefore, optimizing the data collection process with the right quality becomes crucial.</p>
<h1>Traditional methods are becoming less effective</h1>
<p>Traditional software development methods are becoming less effective when dealing with large databases. They often rely solely on structurally processed data and predefined rules, which may not be suitable for working with unstructured text and the subtleties of natural writing. The classical approach to software development faces challenges when dealing with large knowledge bases.</p>
<p>Working on <a href="https://docsquality.com/">DocsQuality</a>, we lower the barrier for teams to access NLP (Neuro-Linguistic Programming) and LLM (Large Language Model) tools, enabling them to easily retrieve data from unstructured texts and documents.</p>
<p>The role of DocsQuality software is to assess document attributes before they are imported into the accounting workflow. It evaluates real-time factors such as readability, clarity, and file quality. The software immediately highlights issues, for example, with email attachments, signaling that the system should not accept the document into the workflow at this stage.</p>
<h1>NLP and LLM models</h1>
<p>Combining and applying NLP and LLM models is an innovative method for assessing document quality. During software development, NLP can be used to extract text from image documents, utilizing Optical Character Recognition (OCR) techniques to transform image text into editable text, which can then be evaluated for quality. On the other hand, LLM models can read and understand text in PDF documents, allowing for assessment of readability, grammar, syntax, and spelling correctness, followed by content analysis, inference, and understanding.</p>
<p>The engineers at Inero Software are continuously developing the functionalities offered by DocsQuality. Creating new software in such a dynamic environment requires constant improvement and searching for optimal solutions. The potential of integrating NLP and LLM tools into this software will enable even more precise documentation analysis in the future.</p>
<h1><a href="https://docsquality.com/">DocsQuality</a> software</h1>
<p>If you are interested in <a href="https://docsquality.com/">DocsQuality</a> software, we invite you to visit our website at <a href="https://docsquality.com/">https://docsquality.com/</a> and contact us via email at <a href="mailto:hi@docs-quality.com">hi@docs-quality.com</a>. We would be happy to answer all your questions and provide information about its functionalities and implementation. DocsQuality can be successfully integrated with an existing ERP system, expanding the offered functionalities to include effective monitoring of document quality, and allowing the identification of problematic files before they are introduced into the accounting workflow.</p>
<p>&nbsp;</p>
<p>Artykuł <a href="https://inero-software.com/optimization-of-data-collection-process-thanks-to-ai-algorithms/">Optimization of Data Collection Process Thanks to AI Algorithms</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5070</post-id>	</item>
		<item>
		<title>ChatGPT &#8211; A developer&#8217;s point of view</title>
		<link>https://inero-software.com/chatgpt-a-developers-point-of-view/</link>
		
		<dc:creator><![CDATA[Marceli Formela]]></dc:creator>
		<pubDate>Wed, 18 Jan 2023 10:28:43 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[.NET AI]]></category>
		<category><![CDATA[AI development]]></category>
		<category><![CDATA[AI innovations]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[Codex]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=4968</guid>

					<description><![CDATA[<p>INTRODUCTION ChatGPT was introduced a few weeks ago and since then it has been one of the main topics in the IT industry. In this blog post, we&#8217;ll take a closer look at what GPT is and the potential applications of this powerful technology in the hands of software engineer.&#8230;</p>
<p>Artykuł <a href="https://inero-software.com/chatgpt-a-developers-point-of-view/">ChatGPT &#8211; A developer&#8217;s point of view</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2><img loading="lazy" decoding="async" data-attachment-id="1596" data-permalink="https://inero-software.com/?attachment_id=1596" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-software-glify-10" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-1596" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" alt="Separating icon" width="90" height="90" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png 80w" sizes="(max-width: 90px) 100vw, 90px" /></h2>
<h3 style="text-align: center;"><span style="color: #800080;">INTRODUCTION</span></h3>
<p><img loading="lazy" decoding="async" data-attachment-id="2768" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-08/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Glyph v8" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" tabindex="0" role="button" class=" wp-image-2768 alignleft" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" alt="Paragrapgh icon" width="106" height="106" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w" sizes="(max-width: 106px) 100vw, 106px" />ChatGPT was introduced a few weeks ago and since then it has been one of the main topics in the IT industry. In this blog post, we&#8217;ll take a closer look at what GPT is and the potential applications of this powerful technology in the hands of software engineer. GPT-3 is the third and newest generation of GPT models and it is one of the most powerful language so far. It is trained with a big amount of text data from multiple sources which include websites and books. It can be still fine-tuned for a wide range of tasks, including text summarization, extracting data from documents and question answering in one of the many specific domains.</p>
<p>ChatGPT, on the other hand, is the most recent specialized version of the GPT-3, tailored to the needs of chatbot applications. Reinforcement Learning with Human Feedback (RLHF) was used to improve the model’s outputs by incorporating human feedback during training. By learning from human corrections and preferences, the model’s output can become more accurate. In many cases this model can be generally faster and more efficient than GPT-3 and that’s why it can be a better choice for use in real-time use-cases. However, in general it may be not as powerful as the source model which can be additionally fine-tuned. They both seems to be designed for different purposes.</p>
<p>There are also other GPT-3-based (older) models that are specifically designed to work with code rather than general natural language. OpenAI Codex is pre-trained on a large dataset of code, which allows it to ‘understand’ the structure and semantics of code. One of the most popular Codex-based tools is Github Copilot that uses this model to suggest code and entire functions in real-time even from IDE.</p>
<p>That’s some theory. But can we efficiently work with code, at least in some way, using the newest solution – ChatGPT instead of Codex-based ones?</p>
<h2><img loading="lazy" decoding="async" data-attachment-id="1596" data-permalink="https://inero-software.com/?attachment_id=1596" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-software-glify-10" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-1596" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" alt="Separating icon" width="90" height="90" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png 80w" sizes="(max-width: 90px) 100vw, 90px" /></h2>
<h3 style="text-align: center;"><span style="color: #800080;">PLAYING IN THE PLAYGROUND</span></h3>
<h4 style="text-align: center;">#CASE 1</h4>
<p><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class=" wp-image-2873 alignleft" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" alt="Paragraph icon" width="57" height="57" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w" sizes="(max-width: 57px) 100vw, 57px" />In the first step, we checked how the model deals with modelling domain classes and incorporating the Domain Driven Design (DDD) approach (at least in very basic version). In short, Domain-Driven Design (DDD) is methodology that aims to bridge the gap between business and software by aligning the structure of the code with the business domain it represents. DDD utilizes principles and patterns to create a clear mapping between the business and software, making it easier for developers to understand the code and for domain experts to understand the software.</p>
<p><strong>Input:</strong> Give me an example of using Domain Driven Design. Let this be an example of a car booking system. There we should have reservations, users and cars. Indicate what could be Value Object, Entity, and Aggregate.<br />
<strong>Output:</strong></p>
<p><img loading="lazy" decoding="async" data-attachment-id="4969" data-permalink="https://inero-software.com/chatgpt-a-developers-point-of-view/case1-output1/" data-orig-file="https://inero-software.com/wp-content/uploads/2023/01/CASE1-OUTPUT1.png" data-orig-size="697,1519" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="CASE1-OUTPUT1" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2023/01/CASE1-OUTPUT1-138x300.png" data-large-file="https://inero-software.com/wp-content/uploads/2023/01/CASE1-OUTPUT1-473x1030.png" tabindex="0" role="button" class="aligncenter wp-image-4969 size-full" src="https://inero-software.com/wp-content/uploads/2023/01/CASE1-OUTPUT1.png" alt="" width="697" height="1519" srcset="https://inero-software.com/wp-content/uploads/2023/01/CASE1-OUTPUT1.png 697w, https://inero-software.com/wp-content/uploads/2023/01/CASE1-OUTPUT1-138x300.png 138w, https://inero-software.com/wp-content/uploads/2023/01/CASE1-OUTPUT1-473x1030.png 473w" sizes="(max-width: 697px) 100vw, 697px" /></p>
<p><img loading="lazy" decoding="async" data-attachment-id="4970" data-permalink="https://inero-software.com/chatgpt-a-developers-point-of-view/case1-output2/" data-orig-file="https://inero-software.com/wp-content/uploads/2023/01/CASE1-OUTPUT2.png" data-orig-size="733,535" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="CASE1-OUTPUT2" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2023/01/CASE1-OUTPUT2-300x219.png" data-large-file="https://inero-software.com/wp-content/uploads/2023/01/CASE1-OUTPUT2.png" tabindex="0" role="button" class="aligncenter wp-image-4970" src="https://inero-software.com/wp-content/uploads/2023/01/CASE1-OUTPUT2.png" alt="" width="697" height="509" srcset="https://inero-software.com/wp-content/uploads/2023/01/CASE1-OUTPUT2.png 733w, https://inero-software.com/wp-content/uploads/2023/01/CASE1-OUTPUT2-300x219.png 300w, https://inero-software.com/wp-content/uploads/2023/01/CASE1-OUTPUT2-411x300.png 411w" sizes="(max-width: 697px) 100vw, 697px" /></p>
<p>ChatGPT correctly generated classes for the domain objects we specified, assigned them some useful properties and methods, and correctly marked value objects, aggregate roots and entities. No errors, no code smells.</p>
<h4 style="text-align: center;">#CASE 2</h4>
<p><strong>Input:</strong> Write a C# method with a string parameter that returns a Base64 version of the input GUID.<br />
<strong>Output:</strong></p>
<p><img loading="lazy" decoding="async" data-attachment-id="4973" data-permalink="https://inero-software.com/chatgpt-a-developers-point-of-view/case2-output1/" data-orig-file="https://inero-software.com/wp-content/uploads/2023/01/CASE2-OUTPUT1.png" data-orig-size="742,571" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="CASE2-OUTPUT1" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2023/01/CASE2-OUTPUT1-300x231.png" data-large-file="https://inero-software.com/wp-content/uploads/2023/01/CASE2-OUTPUT1.png" tabindex="0" role="button" class="aligncenter wp-image-4973" src="https://inero-software.com/wp-content/uploads/2023/01/CASE2-OUTPUT1.png" alt="" width="697" height="536" srcset="https://inero-software.com/wp-content/uploads/2023/01/CASE2-OUTPUT1.png 742w, https://inero-software.com/wp-content/uploads/2023/01/CASE2-OUTPUT1-300x231.png 300w, https://inero-software.com/wp-content/uploads/2023/01/CASE2-OUTPUT1-390x300.png 390w" sizes="(max-width: 697px) 100vw, 697px" /></p>
<p>&nbsp;</p>
<p>All lines of code seem to be at least correct again. But it&#8217;s important to handle exceptions in any method that deals with input that can be malformed or otherwise invalid. In fact, there is a place where exception could be thrown. All we have to do is just ask for changes.</p>
<p><strong>Input:</strong> What about handling exceptions?<br />
<strong>Output:</strong></p>
<p><img loading="lazy" decoding="async" data-attachment-id="4972" data-permalink="https://inero-software.com/chatgpt-a-developers-point-of-view/case2-output2/" data-orig-file="https://inero-software.com/wp-content/uploads/2023/01/CASE2-OUTPUT2.png" data-orig-size="703,472" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="CASE2-OUTPUT2" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2023/01/CASE2-OUTPUT2-300x201.png" data-large-file="https://inero-software.com/wp-content/uploads/2023/01/CASE2-OUTPUT2.png" tabindex="0" role="button" class="aligncenter wp-image-4972" src="https://inero-software.com/wp-content/uploads/2023/01/CASE2-OUTPUT2.png" alt="" width="697" height="468" srcset="https://inero-software.com/wp-content/uploads/2023/01/CASE2-OUTPUT2.png 703w, https://inero-software.com/wp-content/uploads/2023/01/CASE2-OUTPUT2-300x201.png 300w, https://inero-software.com/wp-content/uploads/2023/01/CASE2-OUTPUT2-447x300.png 447w" sizes="(max-width: 697px) 100vw, 697px" /></p>
<p>&nbsp;</p>
<h4 style="text-align: center;">#CASE 3</h4>
<p><strong>Input:</strong> Prepare a simple .NET API which returns current weather in a specified city.<br />
<strong>Output:</strong></p>
<p><img loading="lazy" decoding="async" data-attachment-id="4974" data-permalink="https://inero-software.com/chatgpt-a-developers-point-of-view/case3-output1/" data-orig-file="https://inero-software.com/wp-content/uploads/2023/01/CASE3-OUTPUT1.png" data-orig-size="709,925" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="CASE3-OUTPUT1" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2023/01/CASE3-OUTPUT1-230x300.png" data-large-file="https://inero-software.com/wp-content/uploads/2023/01/CASE3-OUTPUT1.png" tabindex="0" role="button" class="wp-image-4974 aligncenter" src="https://inero-software.com/wp-content/uploads/2023/01/CASE3-OUTPUT1.png" alt="" width="697" height="909" srcset="https://inero-software.com/wp-content/uploads/2023/01/CASE3-OUTPUT1.png 709w, https://inero-software.com/wp-content/uploads/2023/01/CASE3-OUTPUT1-230x300.png 230w" sizes="(max-width: 697px) 100vw, 697px" /></p>
<p style="text-align: center;"><img loading="lazy" decoding="async" data-attachment-id="4975" data-permalink="https://inero-software.com/chatgpt-a-developers-point-of-view/case3-output2/" data-orig-file="https://inero-software.com/wp-content/uploads/2023/01/CASE3-OUTPUT2.png" data-orig-size="727,397" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="CASE3-OUTPUT2" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2023/01/CASE3-OUTPUT2-300x164.png" data-large-file="https://inero-software.com/wp-content/uploads/2023/01/CASE3-OUTPUT2.png" tabindex="0" role="button" class="alignnone wp-image-4975" src="https://inero-software.com/wp-content/uploads/2023/01/CASE3-OUTPUT2.png" alt="" width="698" height="381" srcset="https://inero-software.com/wp-content/uploads/2023/01/CASE3-OUTPUT2.png 727w, https://inero-software.com/wp-content/uploads/2023/01/CASE3-OUTPUT2-300x164.png 300w, https://inero-software.com/wp-content/uploads/2023/01/CASE3-OUTPUT2-549x300.png 549w" sizes="(max-width: 698px) 100vw, 698px" /></p>
<p>GET method asynchronously calls an external API &#8211; OpenWeatherMap to retrieve temperature and description. It also does understand that we need to generate our own API key. In the next lines there is a mapping from JSON to Weather class. It does not use any mapping library nor does it manually, instead it makes some workaround using JsonSerializer. It seems like a fully acceptable solution.</p>
<h2></h2>
<h2><img loading="lazy" decoding="async" data-attachment-id="1596" data-permalink="https://inero-software.com/?attachment_id=1596" data-orig-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-software-glify-10" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" tabindex="0" role="button" class="aligncenter wp-image-1596" src="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png" alt="Separating icon" width="90" height="90" srcset="https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2018/11/inero-glify-10-80x80.png 80w" sizes="(max-width: 90px) 100vw, 90px" /></h2>
<h3 style="text-align: center;"><span style="color: #800080;">SUMMARY</span></h3>
<p><img loading="lazy" decoding="async" data-attachment-id="2873" data-permalink="https://inero-software.com/digital-twins-a-dynamic-software-model-of-reality/inero-glify-08-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="inero-glyph" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" tabindex="0" role="button" class=" wp-image-2873 alignleft" src="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png" alt="Paragraph icon" width="87" height="87" srcset="https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08.png 208w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/10/inero-glify-08-50x50.png 50w" sizes="(max-width: 87px) 100vw, 87px" />In many cases, picking the right model is a matter of preference. It seems like Codex/Copilot is more responsive, while ChatGPT is more proactive at work. Copilot can be a good choice for preparing short snippets or scanning all your code, and everyone else’s, and coming up with little adjustments on the fly. It learns style conventions and will adapt to suggestions. It really speeds up the amount of characters on the page and makes refactoring easier as well.</p>
<p>But ChatGPT is good to get broad architectural outlines and answer our questions. It’s easier to use this model for inspiration / exploratory work because we can specify what parts we don’t like and how we would like to change them. It’s more like an AI assistant where you can enter a piece of code and ask it to optimize or refactor it.</p>
<p>Both solutions work in different way but in many cases provide optimal answers if we ‘ask’ them in a proper way. Codex-based tools work more like a tactical advisor, making our tasks done faster and in a more effective way, while ChatGPT can possibly provide us improvements and alternative methods. From a practical point of view they both still are great choice for one-off utilities and functions.</p>
<p>What we have presented here is only a teaser, there is much more to explore. Technologies like these can help software engineers to be more productive by automating tasks that are typically time-consuming or repetitive, such as writing code, documentation and debugging, which allows programmers to focus on more complex and creative tasks.</p>
<p>Overall, GPT-like models can be a valuable tool for programmers when used in conjunction with other programming tools and best practices, but it&#8217;s not a complete replacement for a human software engineer. Sometimes they can be wrong and we have to keep that in mind.</p>
<p>&nbsp;</p>
<p>In <a href="http://inero-software.com">Inero Software</a> we build digital products for <a href="https://inero-software.com/services/">digital logistics of tomorrow.</a> We connect active aproach to analysis of business needs and combine with cutting edge technologies and AI/ML.</p>
<p>Artykuł <a href="https://inero-software.com/chatgpt-a-developers-point-of-view/">ChatGPT &#8211; A developer&#8217;s point of view</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4968</post-id>	</item>
		<item>
		<title>Java 17: New features overview</title>
		<link>https://inero-software.com/java-17-overview/</link>
		
		<dc:creator><![CDATA[Andrzej Chybicki]]></dc:creator>
		<pubDate>Thu, 21 Apr 2022 12:53:22 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[java 11]]></category>
		<category><![CDATA[java 14]]></category>
		<category><![CDATA[java 15]]></category>
		<category><![CDATA[java 16]]></category>
		<category><![CDATA[java 17]]></category>
		<category><![CDATA[pattern matching]]></category>
		<category><![CDATA[records]]></category>
		<category><![CDATA[sealed modifier]]></category>
		<category><![CDATA[string]]></category>
		<category><![CDATA[switch]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=4918</guid>

					<description><![CDATA[<p>Java 17 was released in September 2021. This is the latest release of LTS (Long Term Support). This means that this version will receive updates until 2029. An earlier version of LTS (Java 11) was released in September 2018, and between these two there were new releases every six months, but not covered by extended support.</p>
<p>Artykuł <a href="https://inero-software.com/java-17-overview/">Java 17: New features overview</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>&nbsp;</p>
<div class="row">
<p><div class="col-sm-1"></div></p>
<p><div class="col-sm-10">
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class=" wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="" width="75" height="75" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 75px) 100vw, 75px" /></p>
<h2><span style="color: #800080;">Java 17</span></h2>
<p>&nbsp;</p>
<p><span data-contrast="auto"><span class="TextRun SCXW189727610 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW189727610 BCX0"><span class="TextRun SCXW21457896 BCX0" lang="EN-US" xml:lang="EN-US" data-contrast="auto"><span class="NormalTextRun SCXW21457896 BCX0"><img loading="lazy" decoding="async" data-attachment-id="2768" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-08/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Glyph v8" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png" tabindex="0" role="button" class="alignleft wp-image-2768 " src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png" alt="" width="53" height="53" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08-50x50.png 50w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-08.png 208w" sizes="(max-width: 53px) 100vw, 53px" /></span></span></span></span></span>Java 17 was released in September 2021. This is the latest release of <strong>LTS (Long Term Support)</strong>. This means that this version will receive updated until 2029. An earlier version of LTS (Java 11) was released in September 2018, and between these two there were new releases every six months, but not covered by extended support.</p>
<p>Java was developed slowly to version 8. This appears to be due to a conservative and defensive strategy for introducing changes to the language. At a similar time to Java, the C# language was created, which was characterized by introducing additions on a regular basis to keep the language attractive and effective for programmers. Currently, the Java language is quite often extended with new functionalities but with the usual caution. We’ll cover the latest improvements between versions 11-17 in this article.</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class=" wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="" width="75" height="75" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 75px) 100vw, 75px" /></p>
<p>&nbsp;</p>
<h2><span style="color: #800080;">Switch modification</span></h2>
<p>&nbsp;</p>
<p>Switch in previous versions of Java looked like this:</p>
<p><img loading="lazy" decoding="async" data-attachment-id="4890" data-permalink="https://inero-software.com/?attachment_id=4890" data-orig-file="https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-przed-update.png" data-orig-size="781,563" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Java 17 Switch przed update" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-przed-update-300x216.png" data-large-file="https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-przed-update.png" tabindex="0" role="button" class="aligncenter wp-image-4890 size-full" src="https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-przed-update.png" alt="switch przed aktualizacją" width="781" height="563" srcset="https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-przed-update.png 781w, https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-przed-update-300x216.png 300w, https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-przed-update-768x554.png 768w, https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-przed-update-416x300.png 416w" sizes="(max-width: 781px) 100vw, 781px" /></p>
<p style="text-align: center;"><em>Source: Learn Java 17 with IntelliJ IDEA, https://www.youtube.com/watch?v=FP0V98S4l9w&amp;ab_channel=Java</em></p>
<p>This function is used to consider different variants of a value. Depending on the value we want to convey the appropriate information to the user. Of course, we don’t have to use Switch for this task but the Switch syntax makes the code much more readable.</p>
<p>As you can see in the image above, there is a <strong>break</strong> command after each sequence. If we don’t locate this command in a specific case the executed code will go to the next sequence. Such a mechanism allowed to handle several cases with the same code. This style is also derived from the C language, where it referred to the assembly programming method (a low-level language specific to a given family of processors). Over the years, the style of programming has changed significantly and this use of the <strong>break</strong> command, or the lack of it, is less and less used. If someone forgets to add the <strong>break</strong> commands, the code may not work as intended. Therefore, an arrow notation was invented that implies <strong>break</strong> in arrows. This makes the Switch itself more readable to the user. This is important because there is less chance of making a mistake by accident. Below you can see how this record looks like.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="4891" data-permalink="https://inero-software.com/?attachment_id=4891" data-orig-file="https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-wersja-strzalkowa.png" data-orig-size="818,575" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Java 17 Switch wersja strzałkowa" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-wersja-strzalkowa-300x211.png" data-large-file="https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-wersja-strzalkowa.png" tabindex="0" role="button" class="aligncenter wp-image-4891 size-full" src="https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-wersja-strzalkowa.png" alt="switch w wersji strzałkowej" width="818" height="575" srcset="https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-wersja-strzalkowa.png 818w, https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-wersja-strzalkowa-300x211.png 300w, https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-wersja-strzalkowa-768x540.png 768w, https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-wersja-strzalkowa-427x300.png 427w" sizes="(max-width: 818px) 100vw, 818px" /></p>
<p>It is also possible to implement a return value, depending on the specific variant. This is advantageous because we can get a result that will be analysed further by the program. These features make the expression Switch much more convenient to use. So <a href="https://inero-software.com/inero-software-team-work/">developers</a> can write cleaner code that is easier to understand.</p>
<p><img loading="lazy" decoding="async" data-attachment-id="4892" data-permalink="https://inero-software.com/?attachment_id=4892" data-orig-file="https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-zwrocenie-wartosci.png" data-orig-size="1609,372" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Java 17 Switch zwrócenie wartości" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-zwrocenie-wartosci-300x69.png" data-large-file="https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-zwrocenie-wartosci-1030x238.png" tabindex="0" role="button" class="aligncenter wp-image-4892 size-full" src="https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-zwrocenie-wartosci.png" alt="" width="1609" height="372" srcset="https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-zwrocenie-wartosci.png 1609w, https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-zwrocenie-wartosci-300x69.png 300w, https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-zwrocenie-wartosci-1030x238.png 1030w, https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-zwrocenie-wartosci-768x178.png 768w, https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-zwrocenie-wartosci-1536x355.png 1536w, https://inero-software.com/wp-content/uploads/2022/03/Java-17-Switch-zwrocenie-wartosci-1298x300.png 1298w" sizes="(max-width: 1609px) 100vw, 1609px" /></p>
<h2></h2>
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class=" wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="" width="75" height="75" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 75px) 100vw, 75px" /></p>
<p>&nbsp;</p>
<h2><span style="color: #800080;">NullPointerExceptions</span></h2>
<p>&nbsp;</p>
<p>When programming in a language like Java, there is often a problem with no reference to an object. In earlier versions of the language, the system provided relatively accurate error information but this was not always sufficient to quickly identify the location where the error was causing the error. So far we have been able to find out that it exist at a specific line in the given file. This was problematic because there could be complicated code in one line, which made locating the mistake cumbersome. Before Java 14 the error information was as follows:</p>
<p><span style="color: #ff0000;">Exception in thread „main” java.lang.NullPointerEsception</span></p>
<p><span style="color: #ff0000;">pl.inero.ExamplesTest.NotMeaningFullNullPointerTest(ExamplesTest.java:155)</span></p>
<p>Java 14 introduces a facility that makes messages convey more precise information to programmers. This way, programmers can locate the error faster and go straight to repairing the code. An example of information about the lack of reference to the object in, after the implementation of this improvement, looks like this:</p>
<p><span style="color: #ff0000;">Cannot invoke „String.toUpperCase()” because „testOne.company” is null</span></p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class=" wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="" width="75" height="75" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 75px) 100vw, 75px" /></p>
<p>&nbsp;</p>
<h2><span style="color: #800080;">Improvement to String constant in Java 17</span></h2>
<p>&nbsp;</p>
<p>Java 15 introduces so-called <strong>Text Blocks</strong>. Thanks to them, entering multi-line fixed string is much more convenient. Before Java 15 you had to enter multi-line constant strings on one line and save newlines as /n. The only way to write a multi-line constant in the code on many lines (for readability) was to divide it into smaller fragments connected by the + operator.</p>
<p>In java 15 start a block of text with three quotation marks <span style="color: #008000;">“ “ “</span> and a new line. All subsequent lines up to the next sequence of three quotation marks <span style="color: #008000;">“ “ “</span> will be the contents of the constant. It is not necessary to add newlines with /n. In addition, the indents will be left-aligned as much as possible.</p>
<p>Multi-line String constant before Java 15:</p>
<pre>String beforeTextBlock = <span style="color: #339966;">"SELECT some_id, COUNT(*)</span><span style="color: #3366ff;">\n</span><span style="color: #339966;">"</span> + 
        <span style="color: #339966;">"FROM (</span><span style="color: #3366ff;">\n</span><span style="color: #339966;">"</span> + 
        <span style="color: #339966;">"         select da.some_date dd, d.id some_id</span><span style="color: #3366ff;">\n</span><span style="color: #339966;">"</span> + 
        <span style="color: #339966;">"         from some_aud da</span><span style="color: #3366ff;">\n</span><span style="color: #339966;">"</span> + 
        <span style="color: #339966;">"     ) as subq</span><span style="color: #3366ff;">\n</span><span style="color: #339966;">"</span> + 
        <span style="color: #339966;">"GROUP BY some_id</span><span style="color: #3366ff;">\n</span><span style="color: #339966;">"</span> + 
        <span style="color: #339966;">"</span><span style="color: #3366ff;">\t\t</span><span style="color: #339966;">Double</span> <span style="color: #3366ff;">\"</span><span style="color: #339966;">Double</span> <span style="color: #3366ff;">\"</span><span style="color: #339966;">quotes</span><span style="color: #3366ff;">\"\"</span> <span style="color: #339966;">test</span><span style="color: #3366ff;">\n</span><span style="color: #339966;">"</span>;</pre>
<p>Equivalent multi-line constant String after the introduction of Java 15:</p>
<pre>String withTextBlock = <span style="color: #339966;">"""</span> 
        <span style="color: #339966;">SELECT some_id, COUNT(*)</span> 
<span style="color: #339966;">        FROM (</span> 
<span style="color: #339966;">                 select da.some_date dd, d.id some_id</span> 
<span style="color: #339966;">                 from some_aud da</span> 
<span style="color: #339966;">             ) as subq</span> 
<span style="color: #339966;">        GROUP BY some_id</span> 
        <span style="color: #3366ff;">\t\t</span><span style="color: #339966;">Double „Double „quotes”” test</span> 
<span style="color: #339966;">        """</span>;</pre>
<h2></h2>
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class=" wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="" width="75" height="75" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 75px) 100vw, 75px" /></p>
<p>&nbsp;</p>
<h2><span style="color: #800080;">Pattern Matching</span></h2>
<p>&nbsp;</p>
<p>Java 16 introduced <strong>pattern matching</strong> extension for instanceof operator. Before introducing this functionality, after successfully verifying the class of an object, in order to use its properties, you had to manually cast the object to the verified type. It looked like this:</p>
<pre><span style="color: #3366ff;">if</span>(someObject <span style="color: #3366ff;">instanceof</span> String) { 
    String someString = (String) someObject; 
    <em><span style="color: #808080;">//Operacje na zmiennej someString</span> 
</em>}</pre>
<p>However, thanks to <strong>pattern matching</strong> for instanceof we are able to express the program logic more clearly. Below you can see what the code looks like:</p>
<pre><span style="color: #3366ff;">if</span>(someObject <span style="color: #3366ff;">instanceof</span> String someString) { 
    <em><span style="color: #808080;">//Operacje na zmiennej someString</span> 
</em>}</pre>
<p>Thanks to this update, we can check if an object is an instance of a given class and define a new variable that we assign to the Spring type with one notation:</p>
<p><em>someObject <span style="color: #3366ff;">instanceof</span> <span style="color: #ff0000;">String</span> someString</em></p>
<p>This provision:</p>
<ol>
<li>Checks if someObject is an instance of the <span style="color: #ff0000;">String</span> class,</li>
<li>cast someObject to the <span style="color: #ff0000;">String</span> type,</li>
<li>and assigns a <span style="color: #ff0000;">String</span> object to the variable someString.</li>
</ol>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class=" wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="" width="75" height="75" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 75px) 100vw, 75px" /></p>
<p>&nbsp;</p>
<h2><span style="color: #800080;">Records</span></h2>
<p>&nbsp;</p>
<p>Records have been introduced in Java 16. They allow easier creation of classes for data models. Records automatically implement equals(), hashCode(), toString() and field accessors.</p>
<p>Thanks to this, instead of describing the class with data like this:</p>
<pre><span style="color: #3366ff;">public final class</span> NoRecordClass { 
    <span style="color: #3366ff;">private final</span> String <span style="color: #e000e0;">title</span>; 
    <span style="color: #3366ff;">private final</span> String <span style="color: #e000e0;">author</span>; 

    <span style="color: #3366ff;">public</span> <span style="color: #008080;">NoRecordClass</span>(String title, String author, String isbn) { 
        <span style="color: #3366ff;">this</span>.<span style="color: #e000e0;">title</span> = title; 
        <span style="color: #3366ff;">this</span>.<span style="color: #e000e0;">author</span> = author; 
    } 

    <span style="color: #3366ff;">public</span> String <span style="color: #008080;">getTitle</span>() { 
        <span style="color: #3366ff;">return</span> <span style="color: #e000e0;">title</span>; 
    } 

    <span style="color: #3366ff;">public</span> String <span style="color: #008080;">getAuthor</span>() { 
        <span style="color: #3366ff;">return</span> <span style="color: #e000e0;">author</span>; 
    } 

    <span style="color: #c7a20e;">@Override</span> 
    <span style="color: #3366ff;">public boolean</span> equals(Object o) { 
        <span style="color: #3366ff;">if</span> (<span style="color: #3366ff;">this</span> == o) <span style="color: #3366ff;">return true</span>; 
        <span style="color: #3366ff;">if</span> (o == <span style="color: #3366ff;">null</span> || getClass() != o.getClass()) <span style="color: #3366ff;">return false</span>; 
        NoRecordClass book = (NoRecordClass) o; 
        <span style="color: #3366ff;">return</span> Objects.<em>equals</em>(<span style="color: #e000e0;">title</span>, book.<span style="color: #e000e0;">title</span>) 
                &amp;&amp; Objects.<em>equals</em>(<span style="color: #e000e0;">author</span>, book.<span style="color: #e000e0;">author</span>); 
    } 

    <span style="color: #c7a20e;">@Override</span> 
   <span style="color: #3366ff;"> public int</span> <span style="color: #008080;">hashCode</span>() { 
       <span style="color: #3366ff;"> return</span> Objects.<em>hash</em>(<span style="color: #e000e0;">title</span>, <span style="color: #e000e0;">author</span>); 
    } 
}</pre>
<p>We can use such a short notation:</p>
<pre><span style="color: #3366ff;">public record</span> RecordExample(String title, String author) { 
}</pre>
<p>Note that for a Java 16 record the accessors differ from those shown in the previous sample – to get the value corresponding to the title field in NoRecordClass use the getTitle() method. However, for the RecordExample class use the title() method, that was generated at compile time. As you can see, the difference is that the accessors generated for the record do not have the prefix get. For this reason, the records do not follow the Java Beans encoding convention. According to the <a href="https://openjdk.java.net/jeps/395">JEP 395</a> document, the records are primarily to play the role of the so-called named tuple rather than the easier creation of immutable Java Beans. The difference is rather subtle but it can make it incompatible with some older libraries.</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class=" wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="" width="75" height="75" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 75px) 100vw, 75px" /></p>
<p>&nbsp;</p>
<h2><span style="color: #800080;">Sealed modifier in Java 17</span></h2>
<p>&nbsp;</p>
<p>The last functionality we describe is especially useful for library creators. It is used to control what classes/interfaces can inherit or implement a given class/interface. Thanks to this, no unauthorized person can connect his class to our library. Below you will find what such a record looks like:</p>
<pre><span style="color: #3366ff;">public sealed interface</span> SealedInterface 
        <span style="color: #3366ff;">permits</span> ImplementationNo1, 
                ImplementationNo2, 
                ImplementationNo3 { 
    <span style="color: #3366ff;">int</span> <span style="color: #008080;">getNumber</span>(); 
    String <span style="color: #008080;">getText</span>(); 
    List&lt;String&gt; <span style="color: #008080;">getStrings</span>(); 
}</pre>
<p>&nbsp;</p>
<h2><img loading="lazy" decoding="async" data-attachment-id="2770" data-permalink="https://inero-software.com/data-the-playground-of-machine-learning/inero-glify-10-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-orig-size="208,208" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Inero Software" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" data-large-file="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" tabindex="0" role="button" class=" wp-image-2770 aligncenter" src="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png" alt="" width="75" height="75" srcset="https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10.png 208w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-80x80.png 80w, https://inero-software.com/wp-content/uploads/2019/05/inero-glify-10-50x50.png 50w" sizes="(max-width: 75px) 100vw, 75px" /></h2>
<p>&nbsp;</p>
<h2><span style="color: #800080;">Summary</span></h2>
<p>&nbsp;</p>
<p><strong>Java 17</strong> doesn’t actually provide any spectacular modifications. In fact, it stabilizes the changes that occurred during version 12-16. However, we can point out a few fixes that will definitely improve the work of programmers. This is primarily about: <strong>records, switch, pattern matching, sealed modifier or text blocks</strong>. Java 17 is definitely a big step forward, mainly because it is an LTS version, Thanks to this, developers will be able to count on ongoing support for the functionalities mentioned in this article.</p>
<p><a href="https://inero-software.com/contact-us/"><strong><span style="color: #800080;">Inero Software</span></strong></a> provides knowledge and expertise on how to successfully use cutting edge technologies and data to shape corporate digital products of the future.</p>
<p><span data-contrast="auto">In the <a href="https://inero-software.com/category/blog/company/"><strong><span style="color: #800080;">blog post</span></strong></a> section you will find other articles about IT systems and more!</span></p>
<p><strong>Consulted by: Tomasz Bieliński.</strong></p>
<p></p></div><br />
</p></div>
<p>Artykuł <a href="https://inero-software.com/java-17-overview/">Java 17: New features overview</a> pochodzi z serwisu <a href="https://inero-software.com">Inero Software - Software Consulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4918</post-id>	</item>
	</channel>
</rss>
