<?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>Marceli Formela, Autor w serwisie Inero Software - Rozwiązania IT i Konsulting</title>
	<atom:link href="https://inero-software.com/pl/author/marceli-formela/feed/" rel="self" type="application/rss+xml" />
	<link>https://inero-software.com/pl/author/marceli-formela/</link>
	<description>Tworzymy cyfrowe innowacje</description>
	<lastBuildDate>Fri, 21 Mar 2025 11:25:52 +0000</lastBuildDate>
	<language>pl-PL</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>Marceli Formela, Autor w serwisie Inero Software - Rozwiązania IT i Konsulting</title>
	<link>https://inero-software.com/pl/author/marceli-formela/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">153509928</site>	<item>
		<title>Konfiguracja polityki haseł w Keycloak</title>
		<link>https://inero-software.com/pl/konfiguracja-polityki-hasel-w-keycloak/</link>
		
		<dc:creator><![CDATA[Marceli Formela]]></dc:creator>
		<pubDate>Fri, 21 Mar 2025 11:14:52 +0000</pubDate>
				<category><![CDATA[Blog_pl]]></category>
		<category><![CDATA[Firma]]></category>
		<category><![CDATA[Keycloak]]></category>
		<category><![CDATA[funkcje Keycloak]]></category>
		<category><![CDATA[hasła]]></category>
		<category><![CDATA[keycloak]]></category>
		<category><![CDATA[logowanie]]></category>
		<category><![CDATA[polityka haseł]]></category>
		<category><![CDATA[System IAM]]></category>
		<category><![CDATA[uwierzytelnianie]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=7653</guid>

					<description><![CDATA[<p>W tym artykule najpierw przyjrzymy się wbudowanym mechanizmom zarządzania polityką haseł w Keycloak. Następnie omówimy możliwości ich dostosowania do specyficznych wymagań.</p>
<p>Artykuł <a href="https://inero-software.com/pl/konfiguracja-polityki-hasel-w-keycloak/">Konfiguracja polityki haseł w Keycloak</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="7653" class="elementor elementor-7653" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-949c242 e-flex e-con-boxed e-con e-parent" data-id="949c242" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-a9078db elementor-widget elementor-widget-html" data-id="a9078db" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			 
		</div>
				</div>
				<div class="elementor-element elementor-element-cc34f5b elementor-widget elementor-widget-text-editor" data-id="cc34f5b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4>Skuteczne zarządzanie hasłami jest istotnym elementem zabezpieczania kont użytkowników, a Keycloak dostarcza narzędzia do egzekwowania silnych zasad uwierzytelniania. Dzięki konfiguracji reguł haseł administratorzy mogą zadbać o zgodność poświadczeń ze standardami bezpieczeństwa, minimalizując ryzyko nieautoryzowanego dostępu. Platforma oferuje elastyczne opcje, umożliwiające definiowanie wymagań, dotyczących długości i złożoności haseł, ich ważności oraz zapobiegania ponownemu użyciu.</h4>						</div>
				</div>
				<div class="elementor-element elementor-element-0df981b elementor-widget elementor-widget-text-editor" data-id="0df981b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>W tym artykule najpierw przyjrzymy się wbudowanym mechanizmom zarządzania polityką haseł w Keycloak. Następnie omówimy możliwości ich dostosowania do specyficznych wymagań.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-ad5f7b2 elementor-widget elementor-widget-image" data-id="ad5f7b2" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img fetchpriority="high" decoding="async" width="775" height="411" src="https://inero-software.com/wp-content/uploads/2025/03/115856.png" class="attachment-large size-large wp-image-7638" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/03/115856.png 775w, https://inero-software.com/wp-content/uploads/2025/03/115856-300x159.png 300w, https://inero-software.com/wp-content/uploads/2025/03/115856-768x407.png 768w, https://inero-software.com/wp-content/uploads/2025/03/115856-566x300.png 566w" sizes="(max-width: 775px) 100vw, 775px" data-attachment-id="7638" data-permalink="https://inero-software.com/configuring-password-policies-in-keycloak/attachment/115856/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/03/115856.png" data-orig-size="775,411" 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="115856" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/03/115856-300x159.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/03/115856.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-b583771 elementor-widget elementor-widget-heading" data-id="b583771" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Wbudowane polityki </h3>		</div>
				</div>
				<div class="elementor-element elementor-element-b2a2079 elementor-widget elementor-widget-text-editor" data-id="b2a2079" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Wbudowane polityki haseł w Keycloak umożliwiają administratorom egzekwowanie zasad bezpieczeństwa w celu wzmocnienia uwierzytelniania użytkowników. Poniżej znajduje się krótki opis każdej z nich:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-1dcf64f elementor-widget elementor-widget-text-editor" data-id="1dcf64f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<ol><li><strong>Wygasanie hasła (Expire Password)</strong> – Wymusza zmianę hasła po określonym czasie.</li><li><strong>Iteracje hashowania (Hashing Iterations)</strong> – Określa liczbę iteracji podczas hashowania hasła w celu zwiększenia bezpieczeństwa.</li><li><strong>Brak ponownego użycia (Not Recently Used)</strong> – Zapobiega ponownemu użyciu ostatnich haseł przez użytkownika.</li><li><strong>Czarna lista haseł (Password Blacklist)</strong> – Blokuje określone hasła, zwykle słabe lub powszechnie używane.</li><li><strong>Wyrażenie regularne (Regular Expression)</strong> – Pozwala wymusić niestandardowy wzorzec regex dla walidacji hasła.</li><li><strong>Minimalna długość (Minimum Length)</strong> – Ustawia minimalną liczbę znaków wymaganą w haśle.</li><li><strong>Brak nazwy użytkownika jako hasła (Not Username)</strong> – Uniemożliwia ustawienie nazwy użytkownika jako hasła.</li><li><strong>Brak adresu e-mail jako hasła (Not Email)</strong> – Zapobiega używaniu adresu e-mail jako hasła.</li><li><strong>Brak ponownego użycia w określonym czasie (Not Recently Used in Days)</strong> – Blokuje ponowne użycie hasła przez określoną liczbę dni.</li><li><strong>Nie zawiera nazwy użytkownika (Not Contains Username)</strong> – Wymusza, aby hasło nie zawierało nazwy użytkownika.</li><li><strong>Znaki specjalne (Special Characters)</strong> – Wymaga co najmniej jednego znaku specjalnego w haśle.</li><li><strong>Wielkie litery (Uppercase Characters)</strong> – Wymusza obecność co najmniej jednej wielkiej litery w haśle.</li><li><strong>Małe litery (Lowercase Characters)</strong> – Wymaga co najmniej jednej małej litery w haśle.</li><li><strong>Cyfry (Digits)</strong> – Wymaga co najmniej jednej cyfry w haśle.</li><li><strong>Maksymalny czas ważności uwierzytelnienia (Maximum Authentication Age)</strong> – Określa maksymalny czas ważności sesji przed wymuszeniem ponownego logowania.</li><li><strong>Algorytm hashowania (Hashing Algorithm)</strong> – Określa algorytm używany do szyfrowania haseł.</li><li><strong>Maksymalna długość (Maximum Length)</strong> – Definiuje maksymalną dopuszczalną długość hasła.</li></ol>						</div>
				</div>
				<div class="elementor-element elementor-element-95da107 elementor-widget elementor-widget-heading" data-id="95da107" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Implementacja niestandardowej polityki haseł przy użyciu SPI</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-86f9385 elementor-widget elementor-widget-text-editor" data-id="86f9385" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Aby zaimplementować niestandardową politykę haseł w Keycloak, należy użyć interfejsu dostawcy usług (SPI – Service Provider Interface).</p>						</div>
				</div>
				<div class="elementor-element elementor-element-efcfbc7 elementor-widget elementor-widget-text-editor" data-id="efcfbc7" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>W tym przypadku definiujemy niestandardowego dostawcę polityki haseł, implementując interfejs <strong>PasswordPolicyProviderFactory</strong>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-a47d185 elementor-widget elementor-widget-code-highlight" data-id="a47d185" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard ">
			<pre data-line="" class="highlight-height language-javascript line-numbers">
				<code readonly="true" class="language-javascript">
					<xmp>public class PasswordCustomPolicyProviderFactory implements PasswordPolicyProviderFactory {

	public static final Integer DEFAULT_VALUE = 1;
	public static final String MIN_PASSWORD_LIFETIME_ID = "minimumPasswordLifetime";

	@Override
	public String getId() {
    	return MIN_PASSWORD_LIFETIME_ID;
	}

	@Override
	public PasswordPolicyProvider create(KeycloakSession session) {
    	return new PasswordCustomPolicyProvider(session);
	}
[...]
}

</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-75140a5 elementor-widget elementor-widget-text-editor" data-id="75140a5" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><strong data-start="0" data-end="11" data-is-only-node="">Factory</strong> instancjonuje i zwraca nową instancję <strong data-start="50" data-end="82">PasswordCustomPolicyProvider</strong>, która zawiera logikę walidacji wymuszającą minimalny czas życia hasła. Stała <strong data-start="161" data-end="189">MIN_PASSWORD_LIFETIME_ID</strong> pełni rolę unikalnego identyfikatora tej niestandardowej polityki, a stała <strong data-start="265" data-end="282">DEFAULT_VALUE</strong> określa domyślny minimalny czas życia hasła (w dniach), jeśli nie zostanie skonfigurowana inna wartość w <strong data-start="388" data-end="405">Admin Console</strong>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-3c1cd5b elementor-widget elementor-widget-code-highlight" data-id="3c1cd5b" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard ">
			<pre data-line="" class="highlight-height language-javascript line-numbers">
				<code readonly="true" class="language-javascript">
					<xmp>public class PasswordCustomPolicyProvider implements PasswordPolicyProvider {
np.
   private static final String POLICY_VIOLATION_MESSAGE = "passwordLifetimeViolation";


   private final KeycloakSession keycloakSession;

   public PasswordCustomPolicyProvider(KeycloakSession keycloakSession) {
   	this.keycloakSession = keycloakSession;
   }


   @Override
   public PolicyError validate(RealmModel realm, UserModel user, String password) {
   	PasswordCredentialProvider credentialProvider = new PasswordCredentialProvider(keycloakSession);
   	PasswordCredentialModel credentialModel = credentialProvider.getPassword(realm, user);

   	if (credentialModel == null) {
       	return null;
   	}

   	long passwordCreationTime = credentialModel.getCreatedDate();
   	long currentTime = Time.currentTimeMillis();
   	long elapsedTime = currentTime - passwordCreationTime;

   	PasswordPolicy passwordPolicy = realm.getPasswordPolicy();
   	int minPasswordLifetimeDays = passwordPolicy.getPolicyConfig(PasswordCustomPolicyProviderFactory.MIN_PASSWORD_LIFETIME_ID);
   	long minPasswordLifetimeMillis = TimeUnit.DAYS.toMillis(minPasswordLifetimeDays);
   	return elapsedTime >= minPasswordLifetimeMillis ? null : new PolicyError(POLICY_VIOLATION_MESSAGE, minPasswordLifetimeDays);
   }
[...]
}
</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-7cd9848 elementor-widget elementor-widget-text-editor" data-id="7cd9848" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><strong>PasswordCredentialProvider</strong> może uzyskać dostęp do zapisanego znacznika czasu utworzenia hasła za pośrednictwem instancji <strong>PasswordCredentialModel</strong>. Następnie oblicza <strong>elapsedTime</strong> jako różnicę między tym znacznikiem a bieżącym czasem systemowym, co określa, jak długo hasło jest już używane.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-c8ec00f elementor-widget elementor-widget-text-editor" data-id="c8ec00f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Następnie obiekt <strong>PasswordPolicy</strong> pobiera politykę haseł dla danego realm&#8217;u, wyodrębnia minimalny wymagany czas życia hasła w dniach (<strong>minPasswordLifetimeDays</strong>) i przelicza go na milisekundy (<strong>minPasswordLifetimeMillis</strong>). Polityka ta zapewnia, że hasło było używane przez co najmniej wymagany okres. Jeśli warunek ten nie zostanie spełniony, zwracany jest obiekt <strong>PolicyError</strong>. Klucz wiadomości o błędzie jest zapisany w stałej <strong>POLICY_VIOLATION_MESSAGE</strong>, a jego treść może być dostosowana w naszym motywie. Pozwala to na zdefiniowanie przyjaznego komunikatu, który informuje użytkownika, dlaczego zmiana hasła jest niedostępna i ile czasu pozostało do możliwości ustawienia nowego.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-5c8b84b elementor-widget elementor-widget-image" data-id="5c8b84b" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img decoding="async" width="711" height="443" src="https://inero-software.com/wp-content/uploads/2025/03/122254.png" class="attachment-large size-large wp-image-7639" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/03/122254.png 711w, https://inero-software.com/wp-content/uploads/2025/03/122254-300x187.png 300w, https://inero-software.com/wp-content/uploads/2025/03/122254-481x300.png 481w" sizes="(max-width: 711px) 100vw, 711px" data-attachment-id="7639" data-permalink="https://inero-software.com/configuring-password-policies-in-keycloak/attachment/122254/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/03/122254.png" data-orig-size="711,443" 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="122254" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/03/122254-300x187.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/03/122254.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-a18d447 elementor-widget elementor-widget-text-editor" data-id="a18d447" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>W ten sposób możemy definiować niestandardowe polityki haseł w Keycloak, gdy domyślny zestaw polityk okazuje się niewystarczający dla konkretnych wymagań. Taka elastyczność umożliwia bardziej szczegółową kontrolę nad uwierzytelnianiem użytkowników i zarządzaniem hasłami, gdy zachodzi taka potrzeba.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-ed723ca elementor-widget elementor-widget-heading" data-id="ed723ca" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Dostosowanie interfejsu w celu poprawy UX</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-0d876c8 elementor-widget elementor-widget-text-editor" data-id="0d876c8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Domyślnie Keycloak wyświetla niespełnione polityki haseł osobno na stronie logowania. Może to być problematyczne dla wielu użytkowników, zwłaszcza gdy naruszonych jest kilka zasad jednocześnie. Prowadzi to do przeładowanego interfejsu i utrudnia użytkownikom zrozumienie wszystkich wymagań dotyczących hasła. Aby temu zaradzić, można dostosować ekran logowania tak, aby prezentował zbiorczą listę wszystkich niespełnionych polityk haseł, co zapewni bardziej przejrzyste i przyjazne dla użytkownika doświadczenie.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-129921c elementor-widget elementor-widget-code-highlight" data-id="129921c" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard ">
			<pre data-line="" class="highlight-height language-javascript line-numbers">
				<code readonly="true" class="language-javascript">
					<xmp>public class CustomFreeMarkerLoginFormsProvider extends FreeMarkerLoginFormsProvider {
/**
* Mapping between password policy provider IDs and custom messages
* Note: contains only standard policies that must be displayed in the UI
*/
private final Map<String, String> policyPropertyMessages = Map.of(
LengthPasswordPolicyProviderFactory.ID, MINIMUM_LENGTH_MESSAGE,
MaximumLengthPasswordPolicyProviderFactory.ID, MAXIMUM_LENGTH_MESSAGE,
DigitsPasswordPolicyProviderFactory.ID, MINIMUM_DIGIT_MESSAGE,
SpecialCharsPasswordPolicyProviderFactory.ID, MINIMUM_SPECIAL_CHAR_MESSAGE,
UpperCasePasswordPolicyProviderFactory.ID, MINIMUM_UPPERCASE_MESSAGE,
LowerCasePasswordPolicyProviderFactory.ID, MINIMUM_LOWERCASE_MESSAGE,
NotUsernamePasswordPolicyProviderFactory.ID, NOT_USERNAME_MESSAGE,
NotContainsUsernamePasswordPolicyProviderFactory.ID, NOT_CONTAINS_USERNAME_MESSAGE,
NotEmailPasswordPolicyProviderFactory.ID, NOT_EMAIL_MESSAGE
);

[...]

@Override
protected void createCommonAttributes(Theme theme, Locale locale, Properties messagesBundle,
UriBuilder baseUriBuilder, LoginFormsPages page) {
super.createCommonAttributes(theme, locale, messagesBundle, baseUriBuilder, page);
if (realm != null && realm.getPasswordPolicy() != null) {
attributes.put("passwordPolicies", getPasswordPolicyMessages(realm.getPasswordPolicy(), messagesBundle));
}}

[...]

private Map<String, String> getPasswordPolicyMessages(PasswordPolicy passwordPolicy, Properties messagesBundle) {
Map<String, String> policyMessages = new HashMap<>();
PasswordPolicy.Builder builder = passwordPolicy.toBuilder();
for (String policyName : passwordPolicy.getPolicies()) {
var value = builder.get(policyName);
String message = extractPolicyMessage(policyName, value, messagesBundle);
if (message != null) {
policyMessages.put(policyName, message);
}
}
return policyMessages;
}

[...]

/**
* Extracts a message for a given password policy from the messages bundle
* Note: Policy message is constructed by replacing the {0} placeholder with the policy value
*/
private String extractPolicyMessage(String policy, String value, Properties messagesBundle) {
String property = policyPropertyMessages.get(policy);
if (property == null) {
return null;
}
String policyMessage = messagesBundle.getProperty(property);
return policyMessage != null ? policyMessage.replace("{0}", value) : null;
}
</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-e47c0c6 elementor-widget elementor-widget-text-editor" data-id="e47c0c6" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Funkcja <strong>getPasswordPolicyMessages()</strong> już zbiera polityki haseł z obiektu <strong>PasswordPolicy</strong> i mapuje je na odpowiednie komunikaty z pliku wiadomości (<strong>message bundle</strong>). Można ją rozszerzyć tak, aby wyświetlała wszystkie niespełnione zasady w jednej zbiorczej wiadomości.</p><p>Polityki haseł, takie jak minimalna długość, wymagane cyfry, znaki specjalne itp., są mapowane na komunikaty za pomocą metody <strong>extractPolicyMessage()</strong>. Nasza implementacja serwisu przechodzi przez każdą z zasad i sprawdza, czy jest spełniona. Jeśli nie – wyświetlany jest odpowiadający jej komunikat.</p><p>Na stronie <strong>update-password.ftl</strong> możesz zaprezentować te niespełnione zasady jako listę przy użyciu szablonów <strong>FreeMarker</strong>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-e70d98c elementor-widget elementor-widget-code-highlight" data-id="e70d98c" data-element_type="widget" data-widget_type="code-highlight.default">
				<div class="elementor-widget-container">
					<div class="prismjs-default copy-to-clipboard ">
			<pre data-line="" class="highlight-height language-javascript line-numbers">
				<code readonly="true" class="language-javascript">
					<xmp>
    	<#if passwordPolicies?has_content>
        	<div class="${properties.kcAlertClass}">
            	<div class="${properties.kcAlertIconWrapperClass}">
                	<span class="${properties.kcAlertIconClass}"></span>
            	</div>
            	<span class="${properties.kcAlertTitleClass}">
            	${msg("passwordInstruction")} <br>
            	<#list passwordPolicies?keys as key>
                	<span class="${properties.kcAlertTitleClass}">&#x2022; ${passwordPolicies[key]}</span><br/>
            	</#list>
            	</span>
        	</div>
    	</#if>

</xmp>
				</code>
			</pre>
		</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-358fd5c elementor-widget elementor-widget-image" data-id="358fd5c" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img decoding="async" width="648" height="510" src="https://inero-software.com/wp-content/uploads/2025/03/123206.png" class="attachment-large size-large wp-image-7640" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/03/123206.png 648w, https://inero-software.com/wp-content/uploads/2025/03/123206-300x236.png 300w, https://inero-software.com/wp-content/uploads/2025/03/123206-381x300.png 381w, https://inero-software.com/wp-content/uploads/2025/03/123206-380x300.png 380w" sizes="(max-width: 648px) 100vw, 648px" data-attachment-id="7640" data-permalink="https://inero-software.com/configuring-password-policies-in-keycloak/attachment/123206/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/03/123206.png" data-orig-size="648,510" 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="123206" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/03/123206-300x236.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/03/123206.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-6d7a6c0 elementor-widget elementor-widget-heading" data-id="6d7a6c0" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Praktyczne przykłady polityk haseł</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-776740f elementor-widget elementor-widget-text-editor" data-id="776740f" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Zobaczmy, jak wyglądają polityki haseł w dużych firmach.</p><p> </p><p>Apple wymaga, aby hasła miały co najmniej osiem znaków i zawierały zarówno litery, jak i cyfry. Dodatkowo, hasła nie mogą zawierać trzech lub więcej identycznych znaków pod rząd i nie mogą być powszechnie używanymi hasłami.</p><p> </p><p>Facebook narzuca minimalną długość hasła wynoszącą ponad sześć znaków, choć zaleca stosowanie dłuższych haseł. Choć Meta nie wymaga użycia znaków specjalnych ani cyfr, zachęca do tworzenia złożonych haseł.</p><p> </p><p>Microsoft wymaga, aby hasła miały co najmniej 8 znaków i zawierały co najmniej dwa z następujących typów znaków: wielkie litery, małe litery, cyfry lub symbole. Dodatkowo, system może blokować możliwość ustawienia hasła zbyt podobnego do poprzedniego.</p><p> </p><p>Chociaż firmy te korzystają z różnych narzędzi uwierzytelniania, warto zwrócić uwagę na standardy bezpieczeństwa wdrażane w dużych systemach produkcyjnych.</p><p> </p><p>I mimo że te polityki haseł nie są skrajnie restrykcyjne, użytkownicy powinni unikać wykorzystywania w hasłach wrażliwych danych osobowych, takich jak imiona, daty urodzenia czy numery telefonów. Należy również unikać ponownego używania haseł w różnych usługach, ponieważ może to prowadzić do naruszeń bezpieczeństwa w przypadku przejęcia jednego z kont. Włączenie uwierzytelniania dwuskładnikowego (2FA) i okresowy przegląd bezpieczeństwa haseł to kolejne kroki, które użytkownicy mogą podjąć w celu zwiększenia ochrony.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-d64b6d9 elementor-widget elementor-widget-heading" data-id="d64b6d9" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Podsumowanie </h3>		</div>
				</div>
				<div class="elementor-element elementor-element-911c3a6 elementor-widget elementor-widget-text-editor" data-id="911c3a6" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Jak widać, Keycloak oferuje zestaw domyślnych polityk haseł, które obejmują standardowe zasady bezpieczeństwa, takie jak minimalna długość, wymagania dotyczące złożoności czy historia użycia haseł. Wbudowane polityki są wystarczające w wielu przypadkach, jednak w razie potrzeby istnieje możliwość ich dostosowania do konkretnych wymagań organizacyjnych. Keycloak pozwala również na tworzenie własnych polityk haseł, co daje większą kontrolę nad bezpieczeństwem.</p><p> </p><p>Oprócz modyfikacji samych zasad, Keycloak umożliwia także dostosowanie interfejsu użytkownika. Jest to szczególnie przydatne w sytuacjach, gdy domyślny sposób prezentowania naruszeń polityk haseł — np. wyświetlanie niespełnionych wymagań osobno — nie spełnia naszych oczekiwań. W takich przypadkach możemy zmienić sposób prezentacji błędów lub wzbogacić komunikaty o dodatkowe informacje, aby były bardziej czytelne i zrozumiałe dla użytkownika.</p><p> </p><p>Dzięki tym możliwościom Keycloak pokazuje wysoki poziom elastyczności, umożliwiając pełną kontrolę zarówno nad politykami bezpieczeństwa, jak i nad wyglądem interfejsu. Czyni go to uniwersalnym rozwiązaniem do zarządzania tożsamością i dostępem. Możliwość definiowania własnych reguł i dostosowywania komponentów sprawia, że Keycloak to skalowalne narzędzie, które z łatwością można dopasować do indywidualnych potrzeb organizacji.</p>						</div>
				</div>
					</div>
				</div>
				</div>
		<p>Artykuł <a href="https://inero-software.com/pl/konfiguracja-polityki-hasel-w-keycloak/">Konfiguracja polityki haseł w Keycloak</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7653</post-id>	</item>
		<item>
		<title>Konfiguracja logowania bezhasłowego za pomocą Passkey na urządzeniu mobilnym</title>
		<link>https://inero-software.com/pl/konfiguracja-logowania-bezhaslowego-za-pomoca-passkey-na-urzadzeniu-mobilnym/</link>
		
		<dc:creator><![CDATA[Marceli Formela]]></dc:creator>
		<pubDate>Wed, 12 Mar 2025 09:02:00 +0000</pubDate>
				<category><![CDATA[Blog_pl]]></category>
		<category><![CDATA[Firma]]></category>
		<category><![CDATA[Keycloak]]></category>
		<category><![CDATA[bezhasłowe]]></category>
		<category><![CDATA[cyberbezpieczeństwo]]></category>
		<category><![CDATA[IAM]]></category>
		<category><![CDATA[keycloak]]></category>
		<category><![CDATA[logowanie]]></category>
		<category><![CDATA[logowanie wieloskładnikowe]]></category>
		<category><![CDATA[MFA]]></category>
		<category><![CDATA[mobilne]]></category>
		<category><![CDATA[Passkey]]></category>
		<category><![CDATA[urządzenia mobilne]]></category>
		<category><![CDATA[uwierzytelnianie wieloskładnikowe]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=7555</guid>

					<description><![CDATA[<p>Ten wpis omawia konfiguracji Passkeys dla urządzeń mobilnych, zapewniając płynne i bezpieczne logowanie bez użycia hasła.</p>
<p>Artykuł <a href="https://inero-software.com/pl/konfiguracja-logowania-bezhaslowego-za-pomoca-passkey-na-urzadzeniu-mobilnym/">Konfiguracja logowania bezhasłowego za pomocą Passkey na urządzeniu mobilnym</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="7555" class="elementor elementor-7555" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-a40bff4 e-flex e-con-boxed e-con e-parent" data-id="a40bff4" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-8062b20 elementor-widget elementor-widget-html" data-id="8062b20" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			 		</div>
				</div>
				<div class="elementor-element elementor-element-8e87fa0 elementor-widget elementor-widget-text-editor" data-id="8e87fa0" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><span style="font-weight: 400;">Nasz pierwszy wpis na temat Passkeys w Keycloak znajdziesz tu: <a href="https://inero-software.com/pl/wprowadzenie-do-passkey-w-keycloak/">Wprowadzenie do Passkeys w Keycloak</a></span></p>						</div>
				</div>
				<div class="elementor-element elementor-element-5dc3085 elementor-widget elementor-widget-text-editor" data-id="5dc3085" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4>W naszym poprzednim wpisie pokazaliśmy, jak skonfigurować Passkeys w Keycloak, zastępując tradycyjne hasła uwierzytelnianiem opartym na WebAuthn. Omówiliśmy proces konfiguracji, kluczowe zalety oraz potencjalne ograniczenia. Ten wpis koncentruje się na konfiguracji Passkeys  dla urządzeń mobilnych, zapewniając płynne i bezpieczne logowanie bez hasła.</h4>						</div>
				</div>
				<div class="elementor-element elementor-element-618f1e8 elementor-widget elementor-widget-text-editor" data-id="618f1e8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>W tym wpisie ponownie omówimy konfigurację uwierzytelniania za pomocą Passkey w Keycloak, jednak tym razem wykorzystamy więcej niż jedno urządzenie.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-9754353 elementor-widget elementor-widget-heading" data-id="9754353" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Korzystanie z Passkey przechowywanego na telefonie</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-f889420 elementor-widget elementor-widget-text-editor" data-id="f889420" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Podczas logowania na innym urządzeniu, takim jak laptop lub komputer stacjonarny, użytkownicy mogą uwierzytelnić się za pomocą Passkey przechowywanego na telefonie. Proces ten przebiega następująco:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-823577d elementor-widget elementor-widget-text-editor" data-id="823577d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<ol>
    <li><strong>Wybór logowania za pomocą Passkey</strong>
        <p>Zamiast wprowadzać hasło, użytkownik wybiera opcję uwierzytelniania za pomocą Passkey. Przeglądarka na laptopie generuje żądanie uwierzytelnienia. Następnie należy nawiązać bezpieczne połączenie między telefonem (np. iPhone) a laptopem.</p>
    </li>
    <li><strong>Skanowanie kodu QR</strong>
        <p>Interfejs logowania generuje kod QR, który użytkownik skanuje aparatem telefonu. Laptop wysyła następnie kryptograficzne wyzwanie do telefonu, prosząc o podpisanie żądania za pomocą przechowywanego Passkey. Telefon komunikuje się z laptopem w sposób bezpieczny, wykorzystując Bluetooth lub inne protokoły łączności bliskiego zasięgu (np. NFC).</p>
    </li>
    <li><strong>Potwierdzenie tożsamości</strong>
        <p>Po otrzymaniu wyzwania telefon prosi użytkownika o uwierzytelnienie biometryczne (np. Face ID lub Touch ID). Dzięki temu weryfikuje, czy osoba próbująca się zalogować jest uprawnionym użytkownikiem.</p>
    </li>
    <li><strong>Bezpieczne uwierzytelnienie</strong>
        <p>Laptop sprawdza odpowiedź telefonu, weryfikując podpis kryptograficzny względem klucza publicznego zarejestrowanego w usłudze. Jeśli weryfikacja przebiegnie pomyślnie, użytkownik zostaje zalogowany bez konieczności wprowadzania hasła.</p>
    </li>
</ol>
						</div>
				</div>
				<div class="elementor-element elementor-element-5edfe44 elementor-widget elementor-widget-heading" data-id="5edfe44" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Krok po kroku: Konfiguracja Passkey za pomocą smartfona</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-b53966d elementor-widget elementor-widget-text-editor" data-id="b53966d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Zanim przejdziemy do niestandardowego procesu uwierzytelniania, należy upewnić się, że w danym realmie jest włączona wymagana akcja <strong>WebAuthn Register Passwordless</strong> (Authentication → zakładka <strong>Required Actions</strong>).</p>						</div>
				</div>
				<div class="elementor-element elementor-element-6d213d0 elementor-widget elementor-widget-image" data-id="6d213d0" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="773" height="180" src="https://inero-software.com/wp-content/uploads/2025/03/12025-03-11.png" class="attachment-large size-large wp-image-7536" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/03/12025-03-11.png 773w, https://inero-software.com/wp-content/uploads/2025/03/12025-03-11-300x70.png 300w, https://inero-software.com/wp-content/uploads/2025/03/12025-03-11-768x179.png 768w" sizes="(max-width: 773px) 100vw, 773px" data-attachment-id="7536" data-permalink="https://inero-software.com/setting-up-passwordless-login-with-passkey-on-a-mobile-device/12025-03-11/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/03/12025-03-11.png" data-orig-size="773,180" 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="12025-03-11" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/03/12025-03-11-300x70.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/03/12025-03-11.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-271f72a elementor-widget elementor-widget-text-editor" data-id="271f72a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Dzięki temu możemy na przykład wymusić konfigurację Passkey przez użytkowników po ich następnym pomyślnym logowaniu. Należy jednak pamiętać, że jest to tylko jedna z wielu metod konfigurowania uwierzytelniania wieloskładnikowego.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-456b3a4 elementor-widget elementor-widget-image" data-id="456b3a4" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="616" height="227" src="https://inero-software.com/wp-content/uploads/2025/03/22025-03-11.png" class="attachment-large size-large wp-image-7537" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/03/22025-03-11.png 616w, https://inero-software.com/wp-content/uploads/2025/03/22025-03-11-300x111.png 300w" sizes="(max-width: 616px) 100vw, 616px" data-attachment-id="7537" data-permalink="https://inero-software.com/setting-up-passwordless-login-with-passkey-on-a-mobile-device/22025-03-11/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/03/22025-03-11.png" data-orig-size="616,227" 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="22025-03-11" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/03/22025-03-11-300x111.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/03/22025-03-11.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-a3f5cac elementor-widget elementor-widget-text-editor" data-id="a3f5cac" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Gdy potwierdzimy, że ta opcja jest aktywna, możemy przejść do konfiguracji procesu uwierzytelniania.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-0950898 elementor-widget elementor-widget-image" data-id="0950898" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="770" height="452" src="https://inero-software.com/wp-content/uploads/2025/03/32025-03-11.png" class="attachment-large size-large wp-image-7538" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/03/32025-03-11.png 770w, https://inero-software.com/wp-content/uploads/2025/03/32025-03-11-300x176.png 300w, https://inero-software.com/wp-content/uploads/2025/03/32025-03-11-768x451.png 768w, https://inero-software.com/wp-content/uploads/2025/03/32025-03-11-511x300.png 511w, https://inero-software.com/wp-content/uploads/2025/03/32025-03-11-512x300.png 512w" sizes="(max-width: 770px) 100vw, 770px" data-attachment-id="7538" data-permalink="https://inero-software.com/setting-up-passwordless-login-with-passkey-on-a-mobile-device/32025-03-11/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/03/32025-03-11.png" data-orig-size="770,452" 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="32025-03-11" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/03/32025-03-11-300x176.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/03/32025-03-11.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-87518d4 elementor-widget elementor-widget-text-editor" data-id="87518d4" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Ten niestandardowy proces uwierzytelniania w Keycloak został zaprojektowany tak, aby pokazać, jak użytkownicy mogą wybierać między uwierzytelnianiem opartym na haśle a uwierzytelnianiem za pomocą Passkey (WebAuthn) podczas logowania. Oto jak to działa:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-d372519 elementor-widget elementor-widget-text-editor" data-id="d372519" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<ul><li style="list-style-type: none;"><ul><li>Użytkownicy muszą podać swoją nazwę użytkownika, aby kontynuować proces uwierzytelniania.</li><li>Ten krok wymusza uwierzytelnienie, jednak użytkownicy mogą wybrać między logowaniem opartym na haśle a logowaniem za pomocą Passkey.</li><li>Jeśli użytkownik wybierze uwierzytelnianie hasłem, wprowadza swoje dane logowania.</li><li>Jeśli preferuje logowanie bezhasłowe przy użyciu Passkey, może uwierzytelnić się tą metodą zamiast hasła.</li></ul></li></ul>						</div>
				</div>
				<div class="elementor-element elementor-element-5a1acc1 elementor-widget elementor-widget-image" data-id="5a1acc1" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="643" height="279" src="https://inero-software.com/wp-content/uploads/2025/03/42025-03-11.png" class="attachment-large size-large wp-image-7539" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/03/42025-03-11.png 643w, https://inero-software.com/wp-content/uploads/2025/03/42025-03-11-300x130.png 300w" sizes="(max-width: 643px) 100vw, 643px" data-attachment-id="7539" data-permalink="https://inero-software.com/setting-up-passwordless-login-with-passkey-on-a-mobile-device/42025-03-11/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/03/42025-03-11.png" data-orig-size="643,279" 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="42025-03-11" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/03/42025-03-11-300x130.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/03/42025-03-11.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-d065fdf elementor-widget elementor-widget-text-editor" data-id="d065fdf" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Na tym etapie użytkownicy mogą wprowadzić swoją nazwę użytkownika lub adres e-mail, aby kontynuować proces uwierzytelniania. Jest to krok wymagany, który zapewnia, że system identyfikuje użytkownika przed udostępnieniem opcji uwierzytelniania.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-4b5d087 elementor-widget elementor-widget-image" data-id="4b5d087" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="644" height="292" src="https://inero-software.com/wp-content/uploads/2025/03/52025-03-11.png" class="attachment-large size-large wp-image-7540" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/03/52025-03-11.png 644w, https://inero-software.com/wp-content/uploads/2025/03/52025-03-11-300x136.png 300w" sizes="(max-width: 644px) 100vw, 644px" data-attachment-id="7540" data-permalink="https://inero-software.com/setting-up-passwordless-login-with-passkey-on-a-mobile-device/52025-03-11/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/03/52025-03-11.png" data-orig-size="644,292" 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="52025-03-11" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/03/52025-03-11-300x136.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/03/52025-03-11.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-a1bfcfe elementor-widget elementor-widget-text-editor" data-id="a1bfcfe" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Na tym etapie możliwe jest jedynie uwierzytelnianie za pomocą hasła, ponieważ Passkey (WebAuthn) nie został jeszcze skonfigurowany. Po jego ustawieniu użytkownicy będą mieli możliwość wyboru między uwierzytelnianiem opartym na haśle a logowaniem bezhasłowym.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-c2348be elementor-widget elementor-widget-image" data-id="c2348be" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="655" height="236" src="https://inero-software.com/wp-content/uploads/2025/03/62025-03-11.png" class="attachment-large size-large wp-image-7541" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/03/62025-03-11.png 655w, https://inero-software.com/wp-content/uploads/2025/03/62025-03-11-300x108.png 300w" sizes="(max-width: 655px) 100vw, 655px" data-attachment-id="7541" data-permalink="https://inero-software.com/setting-up-passwordless-login-with-passkey-on-a-mobile-device/62025-03-11/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/03/62025-03-11.png" data-orig-size="655,236" 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="62025-03-11" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/03/62025-03-11-300x108.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/03/62025-03-11.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-4a740ef elementor-widget elementor-widget-text-editor" data-id="4a740ef" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Zamiast rejestrowania kodu PIN urządzenia, jak wspomniano wcześniej, w tym przykładzie użyjemy uwierzytelniania za pomocą telefonu, konkretnie iPhone&#8217;a.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-8e0e308 elementor-widget elementor-widget-image" data-id="8e0e308" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="558" height="686" src="https://inero-software.com/wp-content/uploads/2025/03/72025-03-11.png" class="attachment-large size-large wp-image-7542" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/03/72025-03-11.png 558w, https://inero-software.com/wp-content/uploads/2025/03/72025-03-11-244x300.png 244w" sizes="(max-width: 558px) 100vw, 558px" data-attachment-id="7542" data-permalink="https://inero-software.com/setting-up-passwordless-login-with-passkey-on-a-mobile-device/72025-03-11/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/03/72025-03-11.png" data-orig-size="558,686" 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="72025-03-11" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/03/72025-03-11-244x300.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/03/72025-03-11.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-512ac1c elementor-widget elementor-widget-image" data-id="512ac1c" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="554" height="704" src="https://inero-software.com/wp-content/uploads/2025/03/82025-03-11.png" class="attachment-large size-large wp-image-7543" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/03/82025-03-11.png 554w, https://inero-software.com/wp-content/uploads/2025/03/82025-03-11-236x300.png 236w" sizes="(max-width: 554px) 100vw, 554px" data-attachment-id="7543" data-permalink="https://inero-software.com/setting-up-passwordless-login-with-passkey-on-a-mobile-device/82025-03-11/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/03/82025-03-11.png" data-orig-size="554,704" 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="82025-03-11" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/03/82025-03-11-236x300.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/03/82025-03-11.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-579c8d6 elementor-widget elementor-widget-text-editor" data-id="579c8d6" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Teraz powinien pojawić się kod QR, umożliwiający rejestrację Passkey na naszym koncie. Zeskanujmy go za pomocą aparatu w telefonie i zweryfikujmy operację, na przykład przy użyciu Face ID.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-e3e3a98 elementor-widget elementor-widget-image" data-id="e3e3a98" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="547" height="241" src="https://inero-software.com/wp-content/uploads/2025/03/92025-03-11.png" class="attachment-large size-large wp-image-7544" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/03/92025-03-11.png 547w, https://inero-software.com/wp-content/uploads/2025/03/92025-03-11-300x132.png 300w" sizes="(max-width: 547px) 100vw, 547px" data-attachment-id="7544" data-permalink="https://inero-software.com/setting-up-passwordless-login-with-passkey-on-a-mobile-device/92025-03-11/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/03/92025-03-11.png" data-orig-size="547,241" 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="92025-03-11" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/03/92025-03-11-300x132.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/03/92025-03-11.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-48105ee elementor-widget elementor-widget-text-editor" data-id="48105ee" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Teraz nasz Passkey powinien być widoczny w sekcji <strong>Credentials</strong>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-1d1bbc7 elementor-widget elementor-widget-image" data-id="1d1bbc7" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="776" height="486" src="https://inero-software.com/wp-content/uploads/2025/03/102025-03-11.png" class="attachment-large size-large wp-image-7545" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/03/102025-03-11.png 776w, https://inero-software.com/wp-content/uploads/2025/03/102025-03-11-300x188.png 300w, https://inero-software.com/wp-content/uploads/2025/03/102025-03-11-768x481.png 768w, https://inero-software.com/wp-content/uploads/2025/03/102025-03-11-479x300.png 479w" sizes="(max-width: 776px) 100vw, 776px" data-attachment-id="7545" data-permalink="https://inero-software.com/setting-up-passwordless-login-with-passkey-on-a-mobile-device/102025-03-11/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/03/102025-03-11.png" data-orig-size="776,486" 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="102025-03-11" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/03/102025-03-11-300x188.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/03/102025-03-11.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-7b13102 elementor-widget elementor-widget-text-editor" data-id="7b13102" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Podczas następnego logowania powinna pojawić się opcja wyboru między uwierzytelnianiem za pomocą hasła a uwierzytelnianiem za pomocą Passkey.</p><p> </p><p>To rozwiązanie zwiększa wygodę użytkowników, umożliwiając im wybór preferowanej metody uwierzytelniania. Passkeys zapewniają bezpieczniejsze i odporne na phishing logowanie, podczas gdy hasła pozostają dostępne dla tych, którzy preferują tradycyjne metody. Dzięki tej elastyczności można zagwarantować zarówno bezpieczeństwo, jak i łatwy dostęp, dostosowany do różnych preferencji użytkowników.</p><p> </p><p>Warto pamiętać, że tradycyjne hasła stanowią słabe ogniwo w bezpieczeństwie cyfrowym i często są narażone na ataki związane z ich ponownym użyciem, phishingiem lub wyciekami danych. Passkeys oferują nowoczesną metodę uwierzytelniania bez hasła, zwiększającą zarówno bezpieczeństwo, jak i wygodę użytkowania dzięki wykorzystaniu kryptograficznych par kluczy zarządzanych przez platformowe mechanizmy uwierzytelniania. Zapewniają odporność na phishing, płynny dostęp na różnych urządzeniach oraz zgodność ze standardami uwierzytelniania wieloskładnikowego (MFA).</p>						</div>
				</div>
				<div class="elementor-element elementor-element-4a97718 elementor-cta--skin-cover elementor-animated-content elementor-bg-transform elementor-bg-transform-zoom-in elementor-widget elementor-widget-call-to-action" data-id="4a97718" data-element_type="widget" data-widget_type="call-to-action.default">
				<div class="elementor-widget-container">
					<a class="elementor-cta" href="https://inero-software.com/pl/najlepsze-praktyki-w-keycloak-zadbaj-o-bezpieczenstwo-w-5-krokach/">
					<div class="elementor-cta__bg-wrapper">
				<div class="elementor-cta__bg elementor-bg" style="background-image: url(https://inero-software.com/wp-content/uploads/2025/01/cta-wm-1-1030x579.png);" role="img" aria-label="cta wm (1)"></div>
				<div class="elementor-cta__bg-overlay"></div>
			</div>
							<div class="elementor-cta__content">
				
									<h2 class="elementor-cta__title elementor-cta__content-item elementor-content-item elementor-animated-item--grow">
						Najlepsze praktyki w Keycloak					</h2>
				
				
									<div class="elementor-cta__button-wrapper elementor-cta__content-item elementor-content-item elementor-animated-item--grow">
					<span class="elementor-cta__button elementor-button elementor-size-">
						Przeczytaj 					</span>
					</div>
							</div>
						</a>
				</div>
				</div>
					</div>
				</div>
				</div>
		<p>Artykuł <a href="https://inero-software.com/pl/konfiguracja-logowania-bezhaslowego-za-pomoca-passkey-na-urzadzeniu-mobilnym/">Konfiguracja logowania bezhasłowego za pomocą Passkey na urządzeniu mobilnym</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7555</post-id>	</item>
		<item>
		<title>Wprowadzenie do Passkey w Keycloak</title>
		<link>https://inero-software.com/pl/wprowadzenie-do-passkey-w-keycloak/</link>
		
		<dc:creator><![CDATA[Marceli Formela]]></dc:creator>
		<pubDate>Wed, 26 Feb 2025 08:54:28 +0000</pubDate>
				<category><![CDATA[Firma]]></category>
		<category><![CDATA[Keycloak]]></category>
		<category><![CDATA[bezpieczeństwo]]></category>
		<category><![CDATA[cyberbezpieczeństwo]]></category>
		<category><![CDATA[hasło]]></category>
		<category><![CDATA[IAM]]></category>
		<category><![CDATA[keycloak]]></category>
		<category><![CDATA[konfiguracja]]></category>
		<category><![CDATA[logowanie]]></category>
		<category><![CDATA[Passkey]]></category>
		<category><![CDATA[passkeys]]></category>
		<category><![CDATA[zarządzanie dostępem i tożsamością]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=7441</guid>

					<description><![CDATA[<p>W tym wpisie pokażemy, jak skonfigurować Passkeys w Keycloak. </p>
<p>Artykuł <a href="https://inero-software.com/pl/wprowadzenie-do-passkey-w-keycloak/">Wprowadzenie do Passkey w Keycloak</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="7441" class="elementor elementor-7441" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-55d1eac e-flex e-con-boxed e-con e-parent" data-id="55d1eac" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-6093d86 elementor-widget elementor-widget-html" data-id="6093d86" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			 		</div>
				</div>
				<div class="elementor-element elementor-element-05e6799 elementor-widget elementor-widget-text-editor" data-id="05e6799" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4>Tradycyjne hasła od dawna stanowią słaby punkt zabezpieczeń cyfrowych. Często te same hasła są wykorzystywane w wielu miejscach, co zwiększa ryzyko ich przejęcia i ułatwia ataki phishingowe. Passkeys to nowoczesne rozwiązanie, które zastępuje hasła kryptograficznymi parami kluczy przypisanymi do konkretnej aplikacji i zarządzanymi przez mechanizmy wbudowane w platformę. Dzięki wykorzystaniu wielu czynników weryfikacyjnych spełniają wymagania MFA (wieloskładnikowego uwierzytelniania) i są zgodne z powszechnie stosowanymi standardami.</h4>						</div>
				</div>
				<div class="elementor-element elementor-element-7416163 elementor-widget elementor-widget-text-editor" data-id="7416163" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>W tym wpisie pokażemy, jak skonfigurować Passkeys na podstawie ustawień Keycloak omówionych we wcześniejszych artykułach (zobacz <a href="https://inero-software.com/pl/zabezpieczanie-punktow-koncowych-java-spring-za-pomoca-keycloak/"><em>Zabezpieczanie endpointów Java Spring za pomocą Keycloak</em></a> lub <a href="https://inero-software.com/pl/praktyczne-wprowadzenie-do-keycloak-sso-od-konfiguracji-do-integracji/"><em>Praktyczne Keycloak SSO: od konfiguracji do integracji</em></a>). Choć Passkeys zapewniają wygodne i bezpieczne logowanie, ich wdrożenie w istniejącym systemie może wiązać się z pewnymi wyzwaniami. Przeprowadzimy Cię przez podstawowy proces konfiguracji. Jeśli chcesz unowocześnić swoją strategię zabezpieczeń, to idealne miejsce, by zacząć.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-c1afbd0 elementor-widget elementor-widget-heading" data-id="c1afbd0" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Jak działają Passkeys?</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-848333b elementor-widget elementor-widget-text-editor" data-id="848333b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Passkeys to metoda logowania, zaprojektowana jako bezpieczniejsza i wygodniejsza alternatywa dla tradycyjnych haseł. W przeciwieństwie do nich, które mogą zostać wyłudzone, skradzione lub zapomniane, passkeys eliminują te zagrożenia dzięki wykorzystaniu kryptograficznych par kluczy przechowywanych w zaufanym narzędziu uwierzytelniającym, takim jak smartfon, inne urządzenie lub menedżer haseł. Zamiast ręcznie tworzyć i zapamiętywać hasło, użytkownik korzysta z autoryzowanego narzędzia do generowania i zarządzania passkey.</p><p>Passkey składa się z dwóch elementów:</p><ul><li style="list-style-type: none;"><ul><li><strong>Klucz publiczny</strong> – przechowywany przez aplikację</li><li><strong>Klucz prywatny</strong> – bezpiecznie zapisany w narzędziu uwierzytelniającym użytkownika</li></ul></li></ul>						</div>
				</div>
				<div class="elementor-element elementor-element-40bb800 elementor-widget elementor-widget-text-editor" data-id="40bb800" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Klucz prywatny nigdy nie opuszcza urządzenia, co gwarantuje, że nawet w przypadku naruszenia klucza publicznego konta pozostają bezpieczne.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-349583e elementor-widget elementor-widget-text-editor" data-id="349583e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<ol><li>Podczas logowania aplikacja wysyła wyzwanie do narzędzia uwierzytelniającego.</li><li>Użytkownik potwierdza swoją tożsamość za pomocą biometrii (Face ID, Touch ID), kodu PIN lub hasła.</li><li>Narzędzie uwierzytelniające podpisuje wyzwanie kluczem prywatnym i odsyła je do weryfikacji.</li><li>Jeśli podpis jest poprawny, dostęp zostaje przyznany – bez konieczności używania hasła.</li></ol>						</div>
				</div>
				<div class="elementor-element elementor-element-1621f94 elementor-widget elementor-widget-image" data-id="1621f94" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="1030" height="425" src="https://inero-software.com/wp-content/uploads/2025/02/passkeys-in-keycloak-schema-1030x425.png" class="attachment-large size-large wp-image-7419" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/02/passkeys-in-keycloak-schema-1030x425.png 1030w, https://inero-software.com/wp-content/uploads/2025/02/passkeys-in-keycloak-schema-300x124.png 300w, https://inero-software.com/wp-content/uploads/2025/02/passkeys-in-keycloak-schema-768x317.png 768w, https://inero-software.com/wp-content/uploads/2025/02/passkeys-in-keycloak-schema-1536x634.png 1536w, https://inero-software.com/wp-content/uploads/2025/02/passkeys-in-keycloak-schema-727x300.png 727w, https://inero-software.com/wp-content/uploads/2025/02/passkeys-in-keycloak-schema.png 1920w" sizes="(max-width: 1030px) 100vw, 1030px" data-attachment-id="7419" data-permalink="https://inero-software.com/an-introduction-to-passkey-with-keycloak/passkeys-in-keycloak-schema/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/02/passkeys-in-keycloak-schema.png" data-orig-size="1920,792" 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="passkeys in keycloak schema" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/02/passkeys-in-keycloak-schema-300x124.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/02/passkeys-in-keycloak-schema-1030x425.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-3000e74 elementor-widget elementor-widget-heading" data-id="3000e74" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Zalety Passkeys</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-b64357e elementor-widget elementor-widget-text-editor" data-id="b64357e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<ul><li style="list-style-type: none;"><ul><li>W przeciwieństwie do haseł, passkeys nie mogą zostać skradzione w wyniku ataków phishingowych. Są powiązane z konkretną stroną internetową lub aplikacją, co oznacza, że nie zadziałają na fałszywych stronach logowania. Nawet jeśli użytkownik wejdzie na stronę phishingową, nie zostanie poproszony o użycie passkey, a logowanie nie nastąpi, co zapobiega kradzieży danych uwierzytelniających.</li><li>Użytkownicy nie muszą zarządzać wieloma hasłami do różnych kont – logowanie sprowadza się do użycia biometrii (Face ID, Touch ID) lub kodu PIN urządzenia.</li><li>Hasła można odgadnąć, ponownie wykorzystać lub wyciekają – passkeys nie. Nawet niektóre metody 2FA, takie jak kody SMS, są podatne na phishing i ataki typu SIM-swapping, podczas gdy passkeys są na nie odporne. Dzięki wykorzystaniu kryptografii klucza publicznego nie mogą zostać przechwycone ani skradzione w wyniku naruszenia danych.</li><li>Passkeys są przechowywane w platformowych narzędziach uwierzytelniających (np. Google Password Manager, Windows Hello). Mogą być automatycznie synchronizowane między urządzeniami, co zapewnia dostęp bez potrzeby ręcznego przenoszenia kluczy.</li></ul></li></ul>						</div>
				</div>
				<div class="elementor-element elementor-element-965d082 elementor-widget elementor-widget-heading" data-id="965d082" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Ograniczenia Passkeys</h3>		</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-dcd18fa e-flex e-con-boxed e-con e-parent" data-id="dcd18fa" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-fba9537 elementor-widget elementor-widget-text-editor" data-id="fba9537" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<ul><li style="list-style-type: none;"><ul><li><p>Nie wszystkie strony internetowe i aplikacje obsługują passkeys, co oznacza, że użytkownicy mogą nadal musieć polegać na hasłach w niektórych usługach.</p></li><li><p>Utrata dostępu do głównego urządzenia lub konta w chmurze może zablokować użytkownika, wymagając opcji odzyskiwania, takich jak urządzenia zapasowe.</p></li><li><p>Wielu użytkowników nie zna jeszcze passkeys, a przejście z haseł wymaga edukacji.</p></li><li><p>Ponieważ passkeys nie wymagają ręcznego wpisywania, użytkownicy mogą odczuwać brak kontroli nad swoimi danymi logowania w porównaniu do tradycyjnego zarządzania hasłami.</p></li></ul></li></ul>						</div>
				</div>
				<div class="elementor-element elementor-element-939f8d6 elementor-widget elementor-widget-heading" data-id="939f8d6" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Konfiguracja Passkey dla Realm</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-5d03766 elementor-widget elementor-widget-text-editor" data-id="5d03766" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Keycloak oferuje elastyczne opcje uwierzytelniania, tradycyjnie opierając się na hasłach i uwierzytelnianiu wieloskładnikowym (MFA) z wykorzystaniem jednorazowych kodów (OTP). Jednak wraz z rosnącą popularnością metod bezhasłowych, Keycloak obsługuje również WebAuthn Passwordless (Passkeys). W tej konfiguracji wyłączymy zarówno hasła, jak i uwierzytelnianie OTP, zapewniając, że użytkownicy mogą logować się wyłącznie za pomocą Passkeys.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-eefe7a4 elementor-widget elementor-widget-image" data-id="eefe7a4" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="692" height="310" src="https://inero-software.com/wp-content/uploads/2025/02/2025-02-241.png" class="attachment-large size-large wp-image-7420" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/02/2025-02-241.png 692w, https://inero-software.com/wp-content/uploads/2025/02/2025-02-241-300x134.png 300w, https://inero-software.com/wp-content/uploads/2025/02/2025-02-241-670x300.png 670w" sizes="(max-width: 692px) 100vw, 692px" data-attachment-id="7420" data-permalink="https://inero-software.com/an-introduction-to-passkey-with-keycloak/2025-02-241/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-241.png" data-orig-size="692,310" 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="2025-02-241" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-241-300x134.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-241.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-7750103 elementor-widget elementor-widget-text-editor" data-id="7750103" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Kolejność mechanizmów uwierzytelniania określa przebieg logowania w Keycloak. Pozostawiamy uwierzytelnianie za pomocą plików cookie, aby użytkownicy mogli utrzymywać aktywne sesje. Aby obsłużyć uwierzytelnianie zewnętrzne, włączamy <strong>Identity Provider Redirect</strong>, co pozwala na logowanie za pomocą dostawców tożsamości, takich jak Google lub inna instancja Keycloak.</p><p>Następnie konfigurujemy właściwy formularz logowania. Domyślnie <strong>browser flow</strong> w Keycloak obejmuje nazwę użytkownika, hasło i uwierzytelnianie wieloskładnikowe (MFA). Możemy wyłączyć wszystkie te elementy i zastąpić je jednym krokiem – dodaniem <strong>WebAuthn Passwordless Authenticator</strong>, co zapewni, że użytkownicy będą mogli logować się wyłącznie za pomocą Passkeys.</p><p> </p><p>Końcowa konfiguracja powinna wyglądać następująco:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-e24f589 elementor-widget elementor-widget-image" data-id="e24f589" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="777" height="655" src="https://inero-software.com/wp-content/uploads/2025/02/2025-02-242.png" class="attachment-large size-large wp-image-7421" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/02/2025-02-242.png 777w, https://inero-software.com/wp-content/uploads/2025/02/2025-02-242-300x253.png 300w, https://inero-software.com/wp-content/uploads/2025/02/2025-02-242-768x647.png 768w, https://inero-software.com/wp-content/uploads/2025/02/2025-02-242-356x300.png 356w" sizes="(max-width: 777px) 100vw, 777px" data-attachment-id="7421" data-permalink="https://inero-software.com/an-introduction-to-passkey-with-keycloak/2025-02-242/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-242.png" data-orig-size="777,655" 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="2025-02-242" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-242-300x253.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-242.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-805cc08 elementor-widget elementor-widget-text-editor" data-id="805cc08" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Gdy <strong>WebAuthn Passwordless Authenticator</strong> zostanie skonfigurowany, kolejnym krokiem jest powiązanie go z przebiegiem logowania w przeglądarce.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-b6799ff elementor-widget elementor-widget-image" data-id="b6799ff" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="691" height="219" src="https://inero-software.com/wp-content/uploads/2025/02/2025-02-243.png" class="attachment-large size-large wp-image-7422" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/02/2025-02-243.png 691w, https://inero-software.com/wp-content/uploads/2025/02/2025-02-243-300x95.png 300w" sizes="(max-width: 691px) 100vw, 691px" data-attachment-id="7422" data-permalink="https://inero-software.com/an-introduction-to-passkey-with-keycloak/2025-02-243/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-243.png" data-orig-size="691,219" 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="2025-02-243" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-243-300x95.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-243.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-3dae270 elementor-widget elementor-widget-text-editor" data-id="3dae270" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Teraz pozostaje już tylko wymusić reset hasła dla przykładowego użytkownika, ustawiając wymaganą akcję na <strong>WebAuthn Register Passwordless</strong>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-f474406 elementor-widget elementor-widget-image" data-id="f474406" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="721" height="298" src="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-4.png" class="attachment-large size-large wp-image-7423" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-4.png 721w, https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-4-300x124.png 300w" sizes="(max-width: 721px) 100vw, 721px" data-attachment-id="7423" data-permalink="https://inero-software.com/an-introduction-to-passkey-with-keycloak/2025-02-24-4/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-4.png" data-orig-size="721,298" 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="2025-02-24 4" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-4-300x124.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-4.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-64055b7 elementor-widget elementor-widget-text-editor" data-id="64055b7" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Po kliknięciu linku w otrzymanym e-mailu Keycloak wyświetli okno dialogowe z instrukcją rejestracji passkey.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-c19dcb2 elementor-widget elementor-widget-image" data-id="c19dcb2" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="677" height="329" src="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-5.png" class="attachment-large size-large wp-image-7424" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-5.png 677w, https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-5-300x146.png 300w, https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-5-617x300.png 617w" sizes="(max-width: 677px) 100vw, 677px" data-attachment-id="7424" data-permalink="https://inero-software.com/an-introduction-to-passkey-with-keycloak/2025-02-24-5/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-5.png" data-orig-size="677,329" 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="2025-02-24 5" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-5-300x146.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-5.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-dd5a7c2 elementor-widget elementor-widget-text-editor" data-id="dd5a7c2" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Wystarczy kliknąć, aby zarejestrować passkey.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-9ea11f9 elementor-widget elementor-widget-image" data-id="9ea11f9" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="574" height="231" src="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-6.png" class="attachment-large size-large wp-image-7425" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-6.png 574w, https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-6-300x121.png 300w" sizes="(max-width: 574px) 100vw, 574px" data-attachment-id="7425" data-permalink="https://inero-software.com/an-introduction-to-passkey-with-keycloak/2025-02-24-6/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-6.png" data-orig-size="574,231" 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="2025-02-24 6" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-6-300x121.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-6.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-c0e48a0 elementor-widget elementor-widget-text-editor" data-id="c0e48a0" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Na ekranie pojawi się platformowy mechanizm uwierzytelniania urządzenia, prezentujący dostępne opcje potwierdzenia tożsamości użytkownika. Załóżmy, że chcemy skorzystać z <strong>Windows Hello</strong> i zweryfikować tożsamość za pomocą kodu PIN – tego samego, który jest używany do logowania do konta Windows.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-2239416 elementor-widget elementor-widget-image" data-id="2239416" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="532" height="670" src="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-7.png" class="attachment-large size-large wp-image-7426" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-7.png 532w, https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-7-238x300.png 238w" sizes="(max-width: 532px) 100vw, 532px" data-attachment-id="7426" data-permalink="https://inero-software.com/an-introduction-to-passkey-with-keycloak/2025-02-24-7/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-7.png" data-orig-size="532,670" 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="2025-02-24 7" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-7-238x300.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-7.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-4a3627a elementor-widget elementor-widget-image" data-id="4a3627a" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="555" height="359" src="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-8.png" class="attachment-large size-large wp-image-7427" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-8.png 555w, https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-8-300x194.png 300w, https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-8-464x300.png 464w" sizes="(max-width: 555px) 100vw, 555px" data-attachment-id="7427" data-permalink="https://inero-software.com/an-introduction-to-passkey-with-keycloak/2025-02-24-8/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-8.png" data-orig-size="555,359" 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="2025-02-24 8" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-8-300x194.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-8.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-af69320 elementor-widget elementor-widget-text-editor" data-id="af69320" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Passkey powinien być teraz widoczny w sekcji poświadczeń wybranego użytkownika.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-7a17718 elementor-widget elementor-widget-image" data-id="7a17718" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="781" height="480" src="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24.png" class="attachment-large size-large wp-image-7428" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24.png 781w, https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-300x184.png 300w, https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-768x472.png 768w, https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-488x300.png 488w" sizes="(max-width: 781px) 100vw, 781px" data-attachment-id="7428" data-permalink="https://inero-software.com/an-introduction-to-passkey-with-keycloak/2025-02-24/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24.png" data-orig-size="781,480" 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="2025-02-24" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-300x184.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-a0801c8 elementor-widget elementor-widget-text-editor" data-id="a0801c8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Teraz możemy przejść do strony logowania w danym <strong>realm</strong> i spróbować użyć passkey zamiast standardowej nazwy użytkownika i hasła.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-5b7fcf8 elementor-widget elementor-widget-image" data-id="5b7fcf8" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="586" height="201" src="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-9.png" class="attachment-large size-large wp-image-7429" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-9.png 586w, https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-9-300x103.png 300w" sizes="(max-width: 586px) 100vw, 586px" data-attachment-id="7429" data-permalink="https://inero-software.com/an-introduction-to-passkey-with-keycloak/2025-02-24-9/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-9.png" data-orig-size="586,201" 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="2025-02-24 9" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-9-300x103.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/02/2025-02-24-9.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-077cb4b elementor-widget elementor-widget-text-editor" data-id="077cb4b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Twój platformowy mechanizm uwierzytelniania powinien ponownie się pojawić, oferując użycie zarejestrowanego passkey.</p><p> </p><p>Passkeys nie są rozwiązaniem idealnym, ale dla większości użytkowników ich zalety przewyższają ograniczenia. Wraz z rosnącą adopcją wiele z tych niedoskonałości zostanie wyeliminowanych. Jednak w krótkim okresie zarówno użytkownicy, jak i organizacje muszą być świadomi potencjalnych wyzwań związanych z ich wdrażaniem.</p><p> </p><p>Organizacje, które chcą zintegrować passkeys ze swoimi systemami uwierzytelniania, mogą skorzystać z narzędzi takich jak <strong>Keycloak</strong>. Dzięki takiej integracji użytkownicy zyskują bezpieczny, bezhasłowy dostęp do aplikacji, przy jednoczesnym wykorzystaniu kluczowych funkcji Keycloak, takich jak <strong>Single Sign-On (SSO), uwierzytelnianie wieloskładnikowe (MFA)</strong> oraz <strong>szczegółowa kontrola dostępu</strong>.</p>						</div>
				</div>
					</div>
				</div>
				</div>
		<p>Artykuł <a href="https://inero-software.com/pl/wprowadzenie-do-passkey-w-keycloak/">Wprowadzenie do Passkey w Keycloak</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7441</post-id>	</item>
		<item>
		<title>Wdrażanie uwierzytelniania wieloskładnikowego za pomocą wiadomości e-mail w Keycloak</title>
		<link>https://inero-software.com/pl/wdrazanie-uwierzytelniania-wieloskladnikowego-za-pomoca-e-maila-w-keycloak/</link>
		
		<dc:creator><![CDATA[Marceli Formela]]></dc:creator>
		<pubDate>Thu, 13 Feb 2025 11:26:40 +0000</pubDate>
				<category><![CDATA[Blog_pl]]></category>
		<category><![CDATA[Firma]]></category>
		<category><![CDATA[Keycloak]]></category>
		<category><![CDATA[cyberbezpieczeństwo]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[keycloak]]></category>
		<category><![CDATA[MFA]]></category>
		<category><![CDATA[uwierzytelnianie email]]></category>
		<category><![CDATA[uwierzytelnianie wieloskładnikowe]]></category>
		<category><![CDATA[zarządzanie dostępem i tożsamością]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=7058</guid>

					<description><![CDATA[<p>W tym artykule przyjrzymy się niestandardowej implementacji MFA, która wysyła jednorazowy kod uwierzytelniający na adres e-mail użytkownika.</p>
<p>Artykuł <a href="https://inero-software.com/pl/wdrazanie-uwierzytelniania-wieloskladnikowego-za-pomoca-e-maila-w-keycloak/">Wdrażanie uwierzytelniania wieloskładnikowego za pomocą wiadomości e-mail w Keycloak</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="7058" class="elementor elementor-7058" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-091b893 e-flex e-con-boxed e-con e-parent" data-id="091b893" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-628ea76 e-con-full e-flex e-con e-child" data-id="628ea76" data-element_type="container">
				</div>
		<div class="elementor-element elementor-element-9ca8a9e e-con-full e-flex e-con e-child" data-id="9ca8a9e" data-element_type="container">
				<div class="elementor-element elementor-element-edd1fd0 elementor-widget elementor-widget-html" data-id="edd1fd0" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			 		</div>
				</div>
				<div class="elementor-element elementor-element-3e56066 elementor-widget elementor-widget-text-editor" data-id="3e56066" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h5>Keycloak natywnie obsługuje wiele bezpiecznych metod logowania i zawiera wbudowane mechanizmy jednorazowych haseł (OTP), takie jak uwierzytelnianie za pomocą aplikacji mobilnych, np. Google Authenticator lub naszego rozwiązania <a href="https://inero-software.com/introducing-authm8-a-free-cross-platform-2fa-solution-tailored-to-your-brand-for-secure-authentication/">AuthM8</a>. Jednak jeśli chcemy korzystać z innych zaawansowanych metod uwierzytelniania i na przykład wysyłać kody OTP przez e-mail, to – podobnie jak w przypadku uwierzytelniania wieloskładnikowego za pomocą SMS (<a href="https://inero-software.com/pl/tworzenie-niestandardowego-uwierzytelniania-sms-w-keycloak/">więcej szczegółów TUTAJ)</a> – musimy samodzielnie zaimplementować tę funkcjonalność. W tym artykule przyjrzymy się niestandardowej implementacji MFA, która wysyła jednorazowy kod uwierzytelniający na adres e-mail użytkownika.</h5>						</div>
				</div>
				<div class="elementor-element elementor-element-0994f82 elementor-widget elementor-widget-heading" data-id="0994f82" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Jak działa uwierzytelnianie wieloskładnikowe oparte na e-mailu?</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-8e8909e elementor-widget elementor-widget-text-editor" data-id="8e8909e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Proces uwierzytelniania składa się z dwóch głównych etapów:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-8435873 elementor-widget elementor-widget-text-editor" data-id="8435873" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<ul><li style="list-style-type: none;"><ul><li><strong>Generowanie i wysyłanie kodu MFA</strong></li></ul></li></ul><p>Jeśli użytkownik ma już aktywny plik cookie potwierdzający wcześniejszą weryfikację MFA, powinien zostać natychmiast uwierzytelniony. W przeciwnym razie Keycloak tworzy nowe poświadczenie dla użytkownika i generuje jednorazowy kod na podstawie konfigurowalnych parametrów, takich jak długość lub czas ważności. Kod jest przechowywany w poświadczeniach użytkownika, a następnie wysyłany e-mailem za pośrednictwem dostawcy poczty e-mail.</p><p> </p><ul><li style="list-style-type: none;"><ul><li><strong>Weryfikacja wprowadzonego kodu</strong></li></ul></li></ul><p>Gdy użytkownik wprowadzi kod, Keycloak pobiera zapisane poświadczenie i porównuje wprowadzoną wartość. Jeśli kod jest poprawny i nadal ważny (nie wygasł), uwierzytelnienie kończy się sukcesem, a plik cookie zostaje zapisany w celu zapamiętania weryfikacji. Jeśli kod jest niepoprawny, użytkownik zostaje poproszony o ponowne jego wprowadzenie. Jeśli kod wygasł, wyświetlany jest komunikat o błędzie i proces musi zostać rozpoczęty od nowa.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-d65460b elementor-widget elementor-widget-image" data-id="d65460b" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="1030" height="579" src="https://inero-software.com/wp-content/uploads/2025/02/EMAIL-BASED-TWO-FACTOR-AUTHENTICATION-FLOWCHART-1030x579.png" class="attachment-large size-large wp-image-7044" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/02/EMAIL-BASED-TWO-FACTOR-AUTHENTICATION-FLOWCHART-1030x579.png 1030w, https://inero-software.com/wp-content/uploads/2025/02/EMAIL-BASED-TWO-FACTOR-AUTHENTICATION-FLOWCHART-300x169.png 300w, https://inero-software.com/wp-content/uploads/2025/02/EMAIL-BASED-TWO-FACTOR-AUTHENTICATION-FLOWCHART-768x432.png 768w, https://inero-software.com/wp-content/uploads/2025/02/EMAIL-BASED-TWO-FACTOR-AUTHENTICATION-FLOWCHART-1536x864.png 1536w, https://inero-software.com/wp-content/uploads/2025/02/EMAIL-BASED-TWO-FACTOR-AUTHENTICATION-FLOWCHART-533x300.png 533w, https://inero-software.com/wp-content/uploads/2025/02/EMAIL-BASED-TWO-FACTOR-AUTHENTICATION-FLOWCHART.png 1920w" sizes="(max-width: 1030px) 100vw, 1030px" data-attachment-id="7044" data-permalink="https://inero-software.com/behind-the-scenes-2-implementing-email-based-mfa-in-keycloak/email-based-two-factor-authentication-flowchart/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/02/EMAIL-BASED-TWO-FACTOR-AUTHENTICATION-FLOWCHART.png" data-orig-size="1920,1080" 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="EMAIL-BASED TWO-FACTOR AUTHENTICATION FLOWCHART" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/02/EMAIL-BASED-TWO-FACTOR-AUTHENTICATION-FLOWCHART-300x169.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/02/EMAIL-BASED-TWO-FACTOR-AUTHENTICATION-FLOWCHART-1030x579.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-5925a75 elementor-widget elementor-widget-heading" data-id="5925a75" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Plusy i minusy</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-3c6c4e2 elementor-widget elementor-widget-text-editor" data-id="3c6c4e2" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Uwierzytelnianie wieloskładnikowe (MFA) oparte na e-mailu zapewnia dodatkowe zabezpieczenie w przypadku naruszenia podstawowego czynnika, takiego jak hasło. Jest to szczególnie przydatne w sytuacjach, gdy hasła zostają złamane metodą brute-force lub są łatwe do odgadnięcia, na przykład w przypadku popularnych kombinacji, takich jak „123456”. Podobnie, to rozwiązanie chroni przed atakami typu credential stuffing, w których cyberprzestępcy wykorzystują wyciekłe hasła z innych naruszeń do prób logowania na konta.</p>
<p><br></p>
<p></p>
<p><strong>Dodatkowe korzyści z używania za pomocą e-maila jako metody MFA:</strong></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li><strong>Brak konieczności podawania dodatkowych wrażliwych informacji</strong>, takich jak numer telefonu, co zmniejsza obawy o prywatność.</li>
<li><strong>Brak potrzeby instalowania osobnej aplikacji ani przechodzenia przez skomplikowaną konfigurację</strong>, co upraszcza cały proces.</li>
<li><strong>Użytkownicy są przyzwyczajeni do podawania adresu e-mail w różnych celach</strong>, takich jak otrzymywanie ważnych powiadomień o koncie czy resetowanie haseł. Ta znajomość sprawia, że metoda ta jest łatwiejsza do zaakceptowania.</li>
</ul>
</li>
</ul>
<p><strong><br></strong></p><p><strong>Ograniczenia MFA opartego na e-mailu:</strong></p>
<p>E-mail jako kanał dostarczania kodów ma również pewne wady. Jeśli atakujący przejmie dostęp do skrzynki e-mail (np. uzyska dane logowania lub wykorzysta aktywną sesję), może potencjalnie zresetować hasła do innych kont. W przypadku użytkowników znajdujących się w szczególnie narażonych sytuacjach, np. korzystających ze współdzielonych urządzeń, MFA oparte na e-mailu może nie zapewnić pełnej ochrony.</p>
<p>Jak w przypadku każdej metody zabezpieczeń, kluczowe jest rozważenie korzyści w stosunku do potencjalnych ryzyk i uzupełnienie MFA opartego na e-mailu innymi środkami bezpieczeństwa, takimi jak silna polityka haseł i bezpieczne praktyki korzystania z poczty e-mail.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-4fd89fe elementor-widget elementor-widget-heading" data-id="4fd89fe" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Wdrożenie MFA opartego na e-mailu</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-cfc16d2 elementor-widget elementor-widget-image" data-id="cfc16d2" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="755" height="508" src="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102335.png" class="attachment-large size-large wp-image-7045" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102335.png 755w, https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102335-300x202.png 300w, https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102335-446x300.png 446w" sizes="(max-width: 755px) 100vw, 755px" data-attachment-id="7045" data-permalink="https://inero-software.com/behind-the-scenes-2-implementing-email-based-mfa-in-keycloak/zrzut-ekranu-2025-02-13-102335/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102335.png" data-orig-size="755,508" 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="Zrzut ekranu 2025-02-13 102335" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102335-300x202.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102335.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-295f2c1 elementor-widget elementor-widget-text-editor" data-id="295f2c1" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>W tym zmodyfikowanym przepływie uwierzytelniania w przeglądarce, integrujemy niestandardowe MFA jako dodatkową metodę uwierzytelniania. Dodane zostały dwa nowe kroki:</p><ul><li style="list-style-type: none;"><ul><li><strong>Konfiguracja MFA opartego na e-mailu</strong> – ten etap zapewnia, że e-mail użytkownika jest skonfigurowany i zweryfikowany przed kontynuacją procesu. Jeśli użytkownik nie posiada niestandardowego poświadczenia MFA (które przechowuje kody OTP jako tajne dane), zostanie ono również ustawione.</li></ul></li></ul>						</div>
				</div>
				<div class="elementor-element elementor-element-1cb9fd2 elementor-widget elementor-widget-text-editor" data-id="1cb9fd2" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><span style="font-weight: 400;">public class MfaEmailSetupAuthenticator implements Authenticator, CredentialValidator&lt;MfaEmailCredentialProvider&gt; {</span><br /><span style="font-weight: 400;">@Override</span><br /><span style="font-weight: 400;">public void authenticate(AuthenticationFlowContext context) {</span><br /><span style="font-weight: 400;">[…]</span><br /><span style="font-weight: 400;">// Require email verification</span><br /><span style="font-weight: 400;">if (!userModel.isEmailVerified()) {</span><br /><span style="font-weight: 400;">userModel.addRequiredAction(UserModel.RequiredAction.VERIFY_EMAIL);</span><br /><span style="font-weight: 400;">}</span><br /><span style="font-weight: 400;">// Add MFA email credential if not present</span><br /><span style="font-weight: 400;">if (!getCredentialProvider(context.getSession()).isConfiguredFor(realmModel, userModel, MfaEmailCredentialModel.TYPE)) {</span><br /><span style="font-weight: 400;">userModel.credentialManager().createStoredCredential(new MfaEmailCredentialModel(new MfaEmailCredentialData()));</span><br /><span style="font-weight: 400;">}</span><br /><span style="font-weight: 400;">[…]</span></pre>						</div>
				</div>
				<div class="elementor-element elementor-element-6908dab elementor-widget__width-initial elementor-widget elementor-widget-image" data-id="6908dab" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="635" height="398" src="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102520.png" class="attachment-large size-large wp-image-7046" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102520.png 635w, https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102520-300x188.png 300w, https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102520-479x300.png 479w" sizes="(max-width: 635px) 100vw, 635px" data-attachment-id="7046" data-permalink="https://inero-software.com/behind-the-scenes-2-implementing-email-based-mfa-in-keycloak/zrzut-ekranu-2025-02-13-102520/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102520.png" data-orig-size="635,398" 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="Zrzut ekranu 2025-02-13 102520" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102520-300x188.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102520.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-eafd6c8 elementor-widget elementor-widget-text-editor" data-id="eafd6c8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<ul><li style="list-style-type: none;"><ul><li><strong>Uwierzytelnianie MFA oparte na e-mailu</strong> – to właściwy etap uwierzytelniania, w którym jednorazowy kod jest wysyłany na adres e-mail użytkownika. Jest oznaczony jako <strong>Alternatywny</strong>, co oznacza, że może być używany zamiast innych metod MFA, takich jak OTP z aplikacji mobilnej.</li></ul></li></ul>						</div>
				</div>
				<div class="elementor-element elementor-element-bdcf27f elementor-widget__width-initial elementor-widget elementor-widget-image" data-id="bdcf27f" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="473" height="622" src="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102652.png" class="attachment-large size-large wp-image-7047" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102652.png 473w, https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102652-228x300.png 228w" sizes="(max-width: 473px) 100vw, 473px" data-attachment-id="7047" data-permalink="https://inero-software.com/behind-the-scenes-2-implementing-email-based-mfa-in-keycloak/zrzut-ekranu-2025-02-13-102652/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102652.png" data-orig-size="473,622" 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="Zrzut ekranu 2025-02-13 102652" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102652-228x300.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-102652.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-10b800d elementor-widget elementor-widget-text-editor" data-id="10b800d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<ul><li style="list-style-type: none;"><ul><li><strong>Max Cookie Age</strong> – to ustawienie określa, jak długo sesja MFA (plik cookie) pozostaje ważna. Jeśli plik cookie jest nadal aktywny, użytkownik nie zostanie ponownie poproszony o uwierzytelnienie MFA.</li><li><strong>Time-to-live</strong> – wskazuje czas życia kodu MFA.</li></ul></li></ul><p> </p><p>Teraz przyjrzyjmy się kodowi.</p><p> </p><p>Poniższa metoda obsługuje sam proces MFA. Jeśli istnieje ważny plik cookie (co oznacza, że użytkownik już ukończył MFA), metoda natychmiast zwraca sukces, kończąc przepływ uwierzytelniania bez konieczności podejmowania dodatkowych działań.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-89fa524 elementor-widget elementor-widget-text-editor" data-id="89fa524" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><span style="font-weight: 400;">@Override</span><br /><span style="font-weight: 400;">public void authenticate(AuthenticationFlowContext context) {</span><br /><span style="font-weight: 400;">if (hasValidCookie(context)) {</span><br /><span style="font-weight: 400;">context.success();</span><br /><span style="font-weight: 400;">return;</span><br /><span style="font-weight: 400;">}</span><br /><span style="font-weight: 400;">[…]</span></pre>						</div>
				</div>
				<div class="elementor-element elementor-element-55ff859 elementor-widget elementor-widget-text-editor" data-id="55ff859" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Jeśli plik cookie nie istnieje, należy spróbować pobrać istniejące poświadczenie MFA użytkownika z dostawcy poświadczeń. Jeśli użytkownik go nie posiada, tworzona jest nowa instancja przy użyciu <strong>MfaEmailCredentialModel</strong>, który rozszerza wbudowany <strong>CredentialModel</strong>.</p><p><span style="font-weight: 400;"> </span></p>						</div>
				</div>
				<div class="elementor-element elementor-element-0af0624 elementor-widget elementor-widget-text-editor" data-id="0af0624" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><span style="font-weight: 400;">[…]</span><br /><span style="font-weight: 400;">// get existing credential or create a new one</span><br /><span style="font-weight: 400;">CredentialModel credentialModel = getCredentialProvider(session)</span><br /><span style="font-weight: 400;">.getDefaultCredential(session, context.getRealm(), user);</span><br /><span style="font-weight: 400;">if (credentialModel == null) {</span><br /><span style="font-weight: 400;">credentialModel = user.credentialManager().createStoredCredential(new MfaEmailCredentialModel(new MfaEmailCredentialData()));</span><br /><span style="font-weight: 400;">}</span><br /><span style="font-weight: 400;">[…]</span></pre>						</div>
				</div>
				<div class="elementor-element elementor-element-c7af14a elementor-widget elementor-widget-text-editor" data-id="c7af14a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Następnie metoda <strong>authenticate</strong> odczytuje właściwości konfiguracyjne, takie jak długość kodu i <strong>TTL</strong> (time-to-live). Sam kod może zostać wygenerowany za pomocą odpowiedniej metody narzędziowej i zostanie zapisany jako <strong>secretData</strong> w modelu poświadczeń.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-6551375 elementor-widget elementor-widget-text-editor" data-id="6551375" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><span style="font-weight: 400;">// generate and store code</span><br /><span style="font-weight: 400;">int length = Integer.parseInt(configMap.get(CONFIG_CODE_LENGTH));</span><br /><span style="font-weight: 400;">int ttl = Integer.parseInt(configMap.get(CONFIG_CODE_TTL));</span><br /><span style="font-weight: 400;">String code = MfaEmailCodesUtils.generateCode(length);</span><br /><span style="font-weight: 400;">credentialModel.setSecretData(code);</span><br /><span style="font-weight: 400;">user.credentialManager().updateStoredCredential(credentialModel);</span><br /><span style="font-weight: 400;">AuthenticationSessionModel authSession = context.getAuthenticationSession();</span><br /><span style="font-weight: 400;">authSession.setAuthNote("ttl", Long.toString(System.currentTimeMillis() + (ttl * 1000L)));</span></pre>						</div>
				</div>
				<div class="elementor-element elementor-element-b7f4d62 elementor-widget elementor-widget-text-editor" data-id="b7f4d62" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Na końcu wywoływana jest metoda <strong>sendCode</strong>, która wysyła wygenerowany kod na adres e-mail użytkownika. Jeśli wiadomość e-mail zostanie wysłana pomyślnie, metoda wyświetla formularz, w którym użytkownik może wprowadzić kod MFA.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-dc63501 elementor-widget elementor-widget-text-editor" data-id="dc63501" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><span style="font-weight: 400;">// send email and show input form</span><br /><span style="font-weight: 400;">try {</span><br /><span style="font-weight: 400;">MfaEmailCodesUtils.sendCode(session, user, ttl, code, configMap);</span><br /><span style="font-weight: 400;">context.challenge(context.form().setAttribute("realm", context.getRealm()).createForm(TPL_CODE));</span><br /><span style="font-weight: 400;">} catch (Exception e) {</span><br /><span style="font-weight: 400;">context.failureChallenge(AuthenticationFlowError.INTERNAL_ERROR,</span><br /><span style="font-weight: 400;">context.form().setError("mfaEmailNotSent", e.getMessage())  .createErrorPage(Response.Status.INTERNAL_SERVER_ERROR));</span><br /><span style="font-weight: 400;">}</span></pre>						</div>
				</div>
				<div class="elementor-element elementor-element-b41ad7b elementor-widget elementor-widget-text-editor" data-id="b41ad7b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Drugą kluczową częścią naszego mechanizmu uwierzytelniania jest metoda <strong>action</strong>, która odpowiada za walidację kodu wprowadzonego przez użytkownika. Jest ona wywoływana w momencie, gdy użytkownik przesyła formularz po otrzymaniu wiadomości e-mail.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-9551f9f elementor-widget__width-initial elementor-widget elementor-widget-image" data-id="9551f9f" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="663" height="391" src="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-103114.png" class="attachment-large size-large wp-image-7048" alt="" srcset="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-103114.png 663w, https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-103114-300x177.png 300w, https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-103114-509x300.png 509w" sizes="(max-width: 663px) 100vw, 663px" data-attachment-id="7048" data-permalink="https://inero-software.com/behind-the-scenes-2-implementing-email-based-mfa-in-keycloak/zrzut-ekranu-2025-02-13-103114/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-103114.png" data-orig-size="663,391" 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="Zrzut ekranu 2025-02-13 103114" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-103114-300x177.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/02/Zrzut-ekranu-2025-02-13-103114.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-460cfb7 elementor-widget elementor-widget-text-editor" data-id="460cfb7" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Metoda pobiera poświadczenie użytkownika od dostawcy, a następnie kod jest weryfikowany poprzez porównanie go z zapisanym poświadczeniem za pomocą niestandardowej metody <strong>isValid</strong>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-ff19a7e elementor-widget elementor-widget-text-editor" data-id="ff19a7e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><span style="font-weight: 400;">[…]</span><br /><span style="font-weight: 400;">final MfaEmailCredentialModel credentialModel = getCredentialProvider(session)</span><br /><span style="font-weight: 400;">        .getDefaultCredential(session, context.getRealm(), user);</span><br /><span style="font-weight: 400;">boolean isValid = getCredentialProvider(session).isValid(context.getRealm(), user,</span><br /><span style="font-weight: 400;">    </span> <span style="font-weight: 400;">new UserCredentialModel(credentialModel.getId(), getCredentialProvider(context.getSession()).getType(), enteredCode));</span><br /><span style="font-weight: 400;">[…]</span></pre>						</div>
				</div>
				<div class="elementor-element elementor-element-7b502f8 elementor-widget elementor-widget-text-editor" data-id="7b502f8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Jeśli kod jest poprawny, następnym krokiem jest sprawdzenie, czy nie wygasł. Możemy również ustawić plik cookie przechowujący sesję MFA, aby zapobiec ponownemu proszeniu użytkownika o uwierzytelnienie MFA w okresie ważności tego pliku cookie.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-3db7437 elementor-widget elementor-widget-text-editor" data-id="3db7437" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><span style="font-weight: 400;">[…]</span><br /><span style="font-weight: 400;">// valid</span><br /><span style="font-weight: 400;">HttpResponse response = context.getSession().getContext().getHttpResponse();</span><br /><span style="font-weight: 400;">response.setCookieIfAbsent(createCookie(context));</span><br /><span style="font-weight: 400;">context.success();</span><br /><span style="font-weight: 400;">[…]</span></pre><p><span style="font-weight: 400;"> </span></p>						</div>
				</div>
				<div class="elementor-element elementor-element-83cf638 elementor-widget elementor-widget-text-editor" data-id="83cf638" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Oczywiście, w tym artykule nie omówimy całego zagadnienia, pomijając szczegóły implementacyjne, takie jak wysyłanie kodu, jego generowanie, walidacja oraz tworzenie niestandardowego pliku cookie.</p><p> </p><p>Jednak przeanalizowaliśmy kluczowe kroki implementacji uwierzytelniania dwuskładnikowego (2FA) przy użyciu kodów wysyłanych na e-mail. Z jednej strony podejście to oferuje prostą i łatwo dostępną metodę zabezpieczeń. Choć ma pewne wady, zastosowanie go w rozwiązaniach takich jak Keycloak pozwala zminimalizować wiele z tych zagrożeń. Keycloak zapewnia również elastyczność w łączeniu MFA opartego na e-mailu z innymi mechanizmami zabezpieczeń, tworząc bardziej warstwowy i odporny proces uwierzytelniania, który może skutecznie chronić przed rozwijającymi się zagrożeniami cybernetycznymi.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-a27180c elementor-cta--skin-cover elementor-animated-content elementor-bg-transform elementor-bg-transform-zoom-in elementor-widget elementor-widget-call-to-action" data-id="a27180c" data-element_type="widget" data-widget_type="call-to-action.default">
				<div class="elementor-widget-container">
					<div class="elementor-cta">
					<div class="elementor-cta__bg-wrapper">
				<div class="elementor-cta__bg elementor-bg" style="background-image: url(https://inero-software.com/wp-content/uploads/2024/11/tlo-popup-keycloak-1030x731.png);" role="img" aria-label="tło popup keycloak"></div>
				<div class="elementor-cta__bg-overlay"></div>
			</div>
							<div class="elementor-cta__content">
				
									<h3 class="elementor-cta__title elementor-cta__content-item elementor-content-item elementor-animated-item--grow">
						Czy potrzebujesz pomocy w konfiguracji uwierzytelniania wieloskładnikowego?					</h3>
				
									<div class="elementor-cta__description elementor-cta__content-item elementor-content-item elementor-animated-item--grow">
						Umów spotkanie, aby dowiedzieć się, jak możemy Ci pomóc.					</div>
				
									<div class="elementor-cta__button-wrapper elementor-cta__content-item elementor-content-item elementor-animated-item--grow">
					<a class="elementor-cta__button elementor-button elementor-size-" href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ3e3C_1YeBkt1uCr_qfOnG_N298UgLFwORcSTXigrPfOk0ls3ok-Uw_dSeGCoLdtYsN13GMm-n-">
						Umów spotkanie 					</a>
					</div>
							</div>
						</div>
				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-6bc7752 e-con-full e-flex e-con e-child" data-id="6bc7752" data-element_type="container">
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-091ddaf e-flex e-con-boxed e-con e-parent" data-id="091ddaf" data-element_type="container">
					<div class="e-con-inner">
					</div>
				</div>
				</div>
		<p>Artykuł <a href="https://inero-software.com/pl/wdrazanie-uwierzytelniania-wieloskladnikowego-za-pomoca-e-maila-w-keycloak/">Wdrażanie uwierzytelniania wieloskładnikowego za pomocą wiadomości e-mail w Keycloak</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">7058</post-id>	</item>
		<item>
		<title>Migracja Keycloak: Porady i najlepsze praktyki</title>
		<link>https://inero-software.com/pl/migracja-keycloak-porady-i-najlepsze-praktyki/</link>
		
		<dc:creator><![CDATA[Marceli Formela]]></dc:creator>
		<pubDate>Tue, 28 Jan 2025 14:32:55 +0000</pubDate>
				<category><![CDATA[Firma]]></category>
		<category><![CDATA[Keycloak]]></category>
		<category><![CDATA[aktualizacja]]></category>
		<category><![CDATA[cyberbezpieczeństwo]]></category>
		<category><![CDATA[keycloak]]></category>
		<category><![CDATA[MFA]]></category>
		<category><![CDATA[migracja]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=6817</guid>

					<description><![CDATA[<p>W tym tekście przedstawiamy najważniejsze zmiany wprowadzone w najnowszych wersjach Keycloak oraz ich wpływ na proces migracji.</p>
<p>Artykuł <a href="https://inero-software.com/pl/migracja-keycloak-porady-i-najlepsze-praktyki/">Migracja Keycloak: Porady i najlepsze praktyki</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="6817" class="elementor elementor-6817" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-bc9a077 e-flex e-con-boxed e-con e-parent" data-id="bc9a077" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-bef05bd e-con-full e-flex e-con e-child" data-id="bef05bd" data-element_type="container">
				</div>
		<div class="elementor-element elementor-element-27ad504 e-con-full e-flex e-con e-child" data-id="27ad504" data-element_type="container">
				<div class="elementor-element elementor-element-e3a7faf elementor-widget elementor-widget-html" data-id="e3a7faf" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			 		</div>
				</div>
				<div class="elementor-element elementor-element-5d77ce3 elementor-widget elementor-widget-text-editor" data-id="5d77ce3" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4>W tym tekście przedstawiamy najważniejsze zmiany wprowadzone w najnowszych wersjach Keycloak oraz ich wpływ na proces migracji. Pokażemy także przykłady rozwiązywania typowych problemów, które pomogą przejść płynnie na nowsze wersje. Niezależnie od tego, czy chodzi o dostosowanie zaktualizowanych konfiguracji, czy zarządzanie wycofanymi funkcjami, ten artykuł dostarczy Ci praktycznych wskazówek, które usprawnią migrację Keycloak.</h4>						</div>
				</div>
				<div class="elementor-element elementor-element-9055b0b elementor-widget elementor-widget-heading" data-id="9055b0b" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default"><strong style="text-indent: 0em;color: var( --e-global-color-primary );text-align: var(--text-align)">Migracja do dystrybucji Quarkus</strong></h3>		</div>
				</div>
				<div class="elementor-element elementor-element-c8c79fe elementor-widget elementor-widget-text-editor" data-id="c8c79fe" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Migracja do dystrybucji Quarkus była jednym z najbardziej wymagających procesów dla wielu użytkowników, szczególnie podczas aktualizacji do Keycloak 17, kiedy architektura zmieniła się z WildFly na framework Quarkus. Ta zmiana oznaczała odejście od tradycyjnego modelu serwera aplikacyjnego na rzecz nowoczesnego, lekkiego podejścia dostosowanego do Quarkusa. Konfiguracja Keycloak została całkowicie zmieniona – zamiast wdrażać aplikację na zewnętrznym serwerze aplikacyjnym, działa ona teraz jako samodzielna aplikacja, co znacząco upraszcza proces wdrażania.</p><p>Na przykład custom providers, które wcześniej było dynamicznie pakowane jako moduły dla WildFly, muszą obecnie zostać przebudowane i dostosowane, ponieważ środowisko wykonawcze (runtime) jest niezmienne. Wymaga to modyfikacji zależności, ładowania klas i metod pakowania. Choć ta zmiana upraszcza wdrażanie w środowiskach takich jak Kubernetes, wymusza również zmianę podejścia w pracy zespołów przyzwyczajonych do rozwiązań opartych na WildFly. Przejście na Quarkus zapewnia znaczące korzyści wydajnościowe i nowocześniejsze środowisko deweloperskie, jednak wymaga starannego planowania i testowania, aby migracja przebiegła pomyślnie.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-e39fb62 elementor-widget elementor-widget-heading" data-id="e39fb62" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default"><strong style="text-indent: 0em;color: var( --e-global-color-primary );text-align: var(--text-align)">Kluczowe zmiany wprowadzone w nowych wersjach</strong></h3>		</div>
				</div>
				<div class="elementor-element elementor-element-9267062 elementor-widget elementor-widget-text-editor" data-id="9267062" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Migracja wprowadza istotne zmiany, które wpływają na konfigurację, endpointy oraz implementacje custom providers:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-4465d06 elementor-widget elementor-widget-text-editor" data-id="4465d06" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><strong>Wymóg HTTPS w trybie produkcyjnym</strong><br />Uruchamianie Keycloak za pomocą polecenia <code>[keycloak_quarkus_root]/26.1.0/bin/kc.bat start</code> wymaga teraz certyfikatu HTTPS, ponieważ opcja <code>start</code> jest przeznaczona do użytku produkcyjnego. Do lokalnego środowiska deweloperskiego należy używać opcji <code>start-dev</code>.</p><p><strong>Usunięcie /auth z podstawowej ścieżki</strong><br />Segment <code>/auth</code> został usunięty z domyślnej podstawowej ścieżki. Aplikacje korzystające z endpointów Keycloak muszą zaktualizować swoje konfiguracje, aby uwzględnić tę zmianę.</p><p><strong>Zmiany w identyfikatorze realm</strong><br />W poprzednich wersjach identyfikator realm był identyczny z jego nazwą. Począwszy od Keycloak 21, identyfikator realm jest teraz unikalną, systemowo generowaną wartością. Aplikacje korzystające z identyfikatorów realm muszą uwzględnić tę zmianę podczas migracji.</p><p><strong>Wycofanie userLocalStorage</strong><br />Custom providers korzystający z metody <code>userLocalStorage</code> interfejsu <code>KeycloakSession</code> muszą przejść na metodę <code>users</code>, ponieważ <code>userLocalStorage</code> została wycofana począwszy od Keycloak 19.</p><p><strong>Transport jdbc-ping jako nowy domyślny</strong><br />W wersji Keycloak 26.1.0 domyślną metodą wykrywania innych węzłów w klastrze stało się korzystanie z bazy danych, zamiast opierania się wyłącznie na multicast. Ta zmiana eliminuje potrzebę dodatkowej konfiguracji sieciowej, szczególnie w środowiskach chmurowych.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-f8db805 elementor-widget elementor-widget-heading" data-id="f8db805" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Problemy z głównymi migracjami</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-c547a32 elementor-widget elementor-widget-text-editor" data-id="c547a32" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Podczas migracji Keycloak zdecydowanie zaleca się aktualizowanie wersji krok po kroku, zamiast przeskakiwania przez kilka wydań jednocześnie. Takie stopniowe podejście pozwala na identyfikację i rozwiązywanie problemów na bieżąco, minimalizując ryzyko nieoczekiwanych komplikacji. Przeskakiwanie przez wiele wersji—szczególnie jeśli obejmuje kilkanaście lub więcej wydań—może znacznie skomplikować proces z uwagi na nagromadzone zmiany, wycofane funkcje oraz zmiany w architekturze, takie jak przejście na Quarkus. Realizowanie zmian związanych z kompatybilnością i konfiguracją etapami pozwala na lepszą kontrolę nad migracją oraz redukcję przestojów i zakłóceń w środowiskach produkcyjnych.</p><p>Jednak w wielu przypadkach konieczna staje się duża, jednorazowa migracja, na przykład z Keycloak 12 bezpośrednio do Keycloak 26, co stanowi wyzwanie, które zespoły muszą skutecznie rozwiązać. Proces ten często wiąże się z istotnymi zmianami zarówno w samym serwerze Keycloak, jak i w aplikacjach zależnych, szczególnie w klientach frontendowych korzystających z jego API.</p><p>W tym przewodniku przedstawimy jak podejść do przeprowadzenia takiej dużej migracji.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-45823ad elementor-widget elementor-widget-heading" data-id="45823ad" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Konfiguracja Dockerfile</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-ce32e89 elementor-widget elementor-widget-text-editor" data-id="ce32e89" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>W naszym przykładowym projekcie wszystkie niestandardowe motywy oraz rozszerzenia SPI (Service Provider Interface) zostały bezpośrednio skopiowane do bazowego obrazu Keycloak, bez dedykowanego procesu budowania. Było to zrealizowane w standardowy sposób stosowany dla WildFly.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-4796eb9 elementor-widget elementor-widget-text-editor" data-id="4796eb9" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><span style="font-weight: 400;">FROM </span><span style="font-weight: 400;">quay.io</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">keycloak</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">keycloak:</span><span style="font-weight: 400;">12.0.2<br /></span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">COPY </span><span style="font-weight: 400;">themes</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">custom-theme </span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">opt</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">jboss</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">keycloak</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">themes/custom-theme</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">COPY </span><span style="font-weight: 400;">api-extensions</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">target</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">spi-resource-0</span><span style="font-weight: 400;">.0.1</span><span style="font-weight: 400;">-</span><span style="font-weight: 400;">SNAPSHOT.jar<br /></span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">ENTRYPOINT /</span><span style="font-weight: 400;">opt</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">jboss</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">tools</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">docker-entrypoint.sh </span><span style="font-weight: 400;">-</span><span style="font-weight: 400;">b </span><span style="font-weight: 400;">0.0.0.0</span></pre>						</div>
				</div>
				<div class="elementor-element elementor-element-b1c75ea elementor-widget elementor-widget-text-editor" data-id="b1c75ea" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Nowe podejście może wykorzystywać proces wieloetapowy z oddzielnymi kontenerami, takimi jak:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-2f2a2de elementor-widget elementor-widget-text-editor" data-id="2f2a2de" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><span style="font-weight: 400;">FROM </span><span style="font-weight: 400;">eclipse-temurin:17-jdk as </span><i><span style="font-weight: 400;">spi_builder</span></i><br /><i><span style="font-weight: 400;">[…]</span></i><br /><span style="font-weight: 400;">FROM </span><span style="font-weight: 400;">quay.io</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">keycloak</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">keycloak:$</span><i><span style="font-weight: 400;">BASE_IMAGE_TAG </span></i><span style="font-weight: 400;">as </span><i><span style="font-weight: 400;">keycloak_builder</span></i><br /><span style="font-weight: 400;">[…]</span><br /><span style="font-weight: 400;">FROM </span><span style="font-weight: 400;">quay.io</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">keycloak</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">keycloak:$</span><i><span style="font-weight: 400;">BASE_IMAGE_TAG</span></i></pre>						</div>
				</div>
				<div class="elementor-element elementor-element-a527627 elementor-widget elementor-widget-text-editor" data-id="a527627" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>SPI jest budowane podczas procesu budowania kontenera przy użyciu narzędzia Maven. Takie podejście zapewnia pobranie zależności oraz optymalizację wygenerowanego pliku JAR do wdrożenia.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-0510f11 elementor-widget elementor-widget-text-editor" data-id="0510f11" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><span style="font-weight: 400;">### Runtime dependencies build container</span><br /><span style="font-weight: 400;">FROM </span><span style="font-weight: 400;">registry.access.redhat.com</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">ubi9 </span><span style="font-weight: 400;">AS </span><i><span style="font-weight: 400;">runtime_dependencies_builder</span></i><br /><span style="font-weight: 400;">RUN </span><span style="font-weight: 400;">mkdir </span><span style="font-weight: 400;">-</span><span style="font-weight: 400;">p </span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">mnt</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">rootfs</span><br /><br /><span style="font-weight: 400;">RUN </span><span style="font-weight: 400;">dnf </span><span style="font-weight: 400;">install </span><span style="font-weight: 400;">--</span><span style="font-weight: 400;">installroot </span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">mnt</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">rootfs curl </span><span style="font-weight: 400;">--</span><span style="font-weight: 400;">releasever </span><span style="font-weight: 400;">9 </span><span style="font-weight: 400;">--</span><span style="font-weight: 400;">setopt install_weak_deps=false </span><span style="font-weight: 400;">--</span><span style="font-weight: 400;">nodocs </span><span style="font-weight: 400;">-</span><span style="font-weight: 400;">y \</span><br /><span style="font-weight: 400;">&amp;&amp; </span><span style="font-weight: 400;">dnf </span><span style="font-weight: 400;">--</span><span style="font-weight: 400;">installroot </span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">mnt</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">rootfs clean all</span><br /><br /><span style="font-weight: 400;">### SPI build container</span><br /><span style="font-weight: 400;">FROM </span><span style="font-weight: 400;">eclipse-temurin:17-jdk as </span><i><span style="font-weight: 400;">spi_builder</span></i><br /><span style="font-weight: 400;">ARG </span><i><span style="font-weight: 400;">BASE_IMAGE_TAG</span></i><br /><span style="font-weight: 400;">WORKDIR /</span><span style="font-weight: 400;">workspace</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">app</span><br /><br /><span style="font-weight: 400;">COPY </span><span style="font-weight: 400;">api-extensions</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">mvnw .</span><br /><span style="font-weight: 400;">COPY </span><span style="font-weight: 400;">api-extensions</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">.mvn .mvn</span><br /><span style="font-weight: 400;">COPY </span><span style="font-weight: 400;">api-extensions</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">pom.xml .</span><br /><br /><span style="font-weight: 400;"># dos2unix:</span><br /><span style="font-weight: 400;">RUN </span><span style="font-weight: 400;">sed </span><span style="font-weight: 400;">-</span><span style="font-weight: 400;">i </span><span style="font-weight: 400;">-</span><span style="font-weight: 400;">e </span><span style="font-weight: 400;">'s/\r//g' </span><span style="font-weight: 400;">mvnw</span><br /><span style="font-weight: 400;">RUN </span><span style="font-weight: 400;">./mvnw </span><span style="font-weight: 400;">dependency:go-offline</span><br /><span style="font-weight: 400;">COPY </span><span style="font-weight: 400;">api-extensions</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">src src</span><br /><span style="font-weight: 400;">RUN </span><span style="font-weight: 400;">./mvnw </span><span style="font-weight: 400;">-</span><span style="font-weight: 400;">o package </span><span style="font-weight: 400;">-</span><span style="font-weight: 400;">DskipTests</span><br /><span style="font-weight: 400;"> </span></pre>						</div>
				</div>
				<div class="elementor-element elementor-element-9851247 elementor-widget elementor-widget-text-editor" data-id="9851247" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Nowy proces kopiuje wiele niestandardowych motywów do Keycloak opartego na Quarkus podczas etapu budowania, zapewniając ich uwzględnienie w finalnym zoptymalizowanym środowisku wykonawczym. Takie podejście poprawia wydajność uruchamiania i jest zgodne z filozofią niezmiennych kontenerów.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-0cd6583 elementor-widget elementor-widget-text-editor" data-id="0cd6583" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><span style="font-weight: 400;">### Build container</span><br /><span style="font-weight: 400;">FROM </span><span style="font-weight: 400;">quay.io</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">keycloak</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">keycloak:$</span><i><span style="font-weight: 400;">BASE_IMAGE_TAG </span></i><span style="font-weight: 400;">as </span><i><span style="font-weight: 400;">keycloak_builder</span></i><br /><span style="font-weight: 400;">COPY --</span><span style="font-weight: 400;">from=</span><i><span style="font-weight: 400;">spi_builder </span></i><span style="font-weight: 400;">/</span><span style="font-weight: 400;">workspace</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">app</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">target</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">spi-resource-0</span><span style="font-weight: 400;">.0.1</span><span style="font-weight: 400;">-</span><span style="font-weight: 400;">SNAPSHOT-jar-with-dependencies.jar </span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">opt</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">keycloak</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">providers</span><span style="font-weight: 400;">/</span><br /><br /><span style="font-weight: 400;">#Copy custom themes</span><br /><span style="font-weight: 400;">COPY </span><span style="font-weight: 400;">themes</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">custom-theme </span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">opt</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">keycloak</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">themes</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">custom-theme</span><br /><br /><span style="font-weight: 400;">#Build an optimized server runtime</span><br /><span style="font-weight: 400;">RUN </span><span style="font-weight: 400;">/opt/keycloak/bin/kc.sh </span><span style="font-weight: 400;">build</span><br /><br /><span style="font-weight: 400;">### Runtime container</span><br /><span style="font-weight: 400;">FROM </span><a href="http://quay.io/keycloak/keycloak:$BASE_IMAGE_TAG"><span style="font-weight: 400;">quay.io/keycloak/keycloak:$</span><i><span style="font-weight: 400;">BASE_IMAGE_TAG</span></i></a><br /><span style="font-weight: 400;">COPY --</span><span style="font-weight: 400;">from=</span><i><span style="font-weight: 400;">keycloak_builder </span></i><span style="font-weight: 400;">/</span><span style="font-weight: 400;">opt</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">keycloak</span><span style="font-weight: 400;">/ /</span><span style="font-weight: 400;">opt</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">keycloak</span><span style="font-weight: 400;">/</span><br /><span style="font-weight: 400;">WORKDIR /</span><span style="font-weight: 400;">opt</span><span style="font-weight: 400;">/</span><span style="font-weight: 400;">keycloak</span><br /><span style="font-weight: 400;">ENTRYPOINT </span><span style="font-weight: 400;">[</span><span style="font-weight: 400;">"/opt/keycloak/bin/kc.sh"</span><span style="font-weight: 400;">]</span></pre>						</div>
				</div>
				<div class="elementor-element elementor-element-1dc220a elementor-widget elementor-widget-text-editor" data-id="1dc220a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Zasadniczo, wykorzystując budowanie wieloetapowe oraz lekkie obrazy, nowy proces jest zgodny z najlepszymi praktykami dotyczącymi wdrożeń konteneryzowanych. Więcej szczegółów na temat tych kroków znajdziesz tutaj: <a href="https://www.keycloak.org/server/containers">https://www.keycloak.org/server/containers</a>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-15c9000 elementor-widget elementor-widget-heading" data-id="15c9000" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default"><strong style="text-indent: 0em;color: var( --e-global-color-primary );text-align: var(--text-align)">Zmiana domyślnej ścieżki kontekstu /auth</strong></h3>		</div>
				</div>
				<div class="elementor-element elementor-element-2ff8164 elementor-widget elementor-widget-text-editor" data-id="2ff8164" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Wraz z przejściem na dystrybucję Keycloak opartą na Quarkus, domyślna ścieżka kontekstu została zmodyfikowana – /auth nie jest już domyślnie częścią URL.</p><p>Ta zmiana jest zgodna z celem Quarkusa, jakim jest dostarczenie bardziej zoptymalizowanego i minimalistycznego podejścia do aplikacji webowych, redukując niepotrzebne prefiksy ścieżek.</p><p>Dla użytkowników lub aplikacji, które nadal wymagają ścieżki kontekstu /auth, można ją ponownie wprowadzić za pomocą opcji build http-relative-path.</p><p>Na przykład, uruchamiając Keycloak przy użyciu następującego polecenia, można przywrócić ścieżkę /auth:</p><pre><code class="language-bash">bin/kc.[sh|bat] start-dev --http-relative-path /auth
</code></pre><p><strong>Lub za pomocą Docker Compose:</strong></p>						</div>
				</div>
				<div class="elementor-element elementor-element-2ee41e2 elementor-widget elementor-widget-text-editor" data-id="2ee41e2" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><span style="font-weight: 400;">KC_HTTP_RELATIVE_PATH</span><span style="font-weight: 400;">: /auth</span></pre>						</div>
				</div>
				<div class="elementor-element elementor-element-27a0144 elementor-widget elementor-widget-text-editor" data-id="27a0144" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Pozwala to na zachowanie kompatybilności z istniejącymi klientami lub konfiguracjami, które opierają się na prefiksie /auth. Po określeniu względnej ścieżki Keycloak nadal automatycznie przekieruje żądania z katalogu głównego (np. localhost:8080/) na ścieżkę /auth (np. localhost:8080/auth). Dzięki temu aplikacje lub użytkownicy przyzwyczajeni do wcześniejszej struktury URL mogą nadal działać zgodnie z oczekiwaniami, bez konieczności wprowadzania większych zmian.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-24a1365 elementor-widget elementor-widget-heading" data-id="24a1365" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Zmiany w zarządzaniu dostawcami</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-557e06a elementor-widget elementor-widget-text-editor" data-id="557e06a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Wraz z przejściem na dystrybucję Keycloak opartą na Quarkus, nastąpiły istotne zmiany w sposobie wdrażania i zarządzania <span style="font-weight: 400;">custom providers</span> (SPI). W dystrybucji opartej na WildFly byli oni wdrażani poprzez kopiowanie do katalogu <strong>standalone/deployments</strong>, a zależności umieszczano w określonych lokalizacjach w strukturze serwera WildFly. Jednak w nowej dystrybucji Quarkus model wdrażania został uproszczony — dostosowani dostawcy powinni być teraz kopiowani do katalogu <strong>/providers</strong>.</p><p>Dodatkowo Quarkus nie obsługuje formatu pakowania EAR ani plików <strong>jboss-deployment-structure.xml</strong>, które były powszechnie wykorzystywane w dystrybucji WildFly do konfiguracji wdrożeń i zarządzania zależnościami. W efekcie proces pakowania został uproszczony, ale dostosowane konfiguracje, które wcześniej były realizowane za pomocą tych plików, muszą być teraz obsługiwane w inny sposób.</p><p>Co więcej, jeśli dostosowani dostawcy korzystali z API JavaEE, takich jak sesyjne lub bezstanowe komponenty (session/stateless beans), nie będą one już obsługiwane w dystrybucji Quarkus.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-7391d60 elementor-widget elementor-widget-heading" data-id="7391d60" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default"><p><strong>Migracja niestandardowych motywów</strong><span style="color: var( --e-global-color-primary );font-family: var( --e-global-typography-primary-font-family ), Sans-serif;font-size: 1.7em;font-weight: var( --e-global-typography-primary-font-weight );text-align: var(--text-align)"></span></p></h3>		</div>
				</div>
				<div class="elementor-element elementor-element-c0ccfee elementor-widget elementor-widget-text-editor" data-id="c0ccfee" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Poprzedni Keycloak korzystał z silnika szablonów FreeMarker do renderowania dynamicznych treści w motywach.<br />Choć podejście to jest nadal stosowane w nowych wersjach (szczególnie w motywach v1 i v2), wprowadzono aktualizacje w składni szablonów oraz strukturze motywów, aby dostosować je do nowej architektury Quarkus. Niestandardowe szablony mogą wymagać dostosowania, aby były kompatybilne z nowszymi wersjami FreeMarker, ponieważ struktura motywów uległa pewnym zmianom.</p><p>Dodatkowo niektóre funkcje i makra szablonów, dostępne w starszych wersjach, takich jak Keycloak 12, mogły zostać wycofane lub zastąpione bardziej wydajnymi odpowiednikami.</p><p>Motywy, które zostały wcześniej dostosowane, prawdopodobnie nie obsługują trybu ciemnego. Aby uniknąć problemów bez konieczności całkowitego ich przepisywania, najprostszym rozwiązaniem jest dodanie opcji <strong>darkMode=false</strong> w pliku <strong>theme.properties</strong>. Co więcej, od wersji 26.1.0 w zakładce <strong>&#8222;Themes&#8221;</strong> pojawiły się przełączniki umożliwiające włączanie trybu ciemnego dla poszczególnych realmów.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-a573147 elementor-widget elementor-widget-heading" data-id="a573147" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Dostosowanie nowego serwera Keycloak do współpracy z frontendem klienta w starszej wersji</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-21c6dc8 elementor-widget elementor-widget-text-editor" data-id="21c6dc8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><strong>Problemy związane z checkLoginIframe</strong></p><p>W jednym z naszych projektów musieliśmy zaktualizować Keycloak o 14 wersji. Jednak z różnych powodów nie mogliśmy zaktualizować frontendu, który działał na dość starej wersji Angulara oraz bibliotece keycloak-angular. Dlatego teraz omówimy modyfikacje, które musieliśmy wprowadzić, aby przywrócić funkcjonalność procesu logowania.</p><p>Keycloak-angular to biblioteka typu wrapper dla keycloak-js, która ułatwia jego wykorzystanie w aplikacjach Angular. Rozszerza oryginalne funkcjonalności o dodatkowe możliwości i wprowadza nowe metody, które ułatwiają integrację w aplikacjach Angular. Biblioteka oferuje również podstawową implementację AuthGuard, umożliwiając dostosowanie logiki autoryzacji. Dodatkowo można korzystać z HttpClient Interceptor, który dodaje nagłówek autoryzacyjny do wybranych żądań HTTP.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-43ca3b8 elementor-widget elementor-widget-text-editor" data-id="43ca3b8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><span style="font-weight: 400;">"keycloak-angular"</span><span style="font-weight: 400;">: </span><span style="font-weight: 400;">"^8.1.0"</span><span style="font-weight: 400;">,</span><br /><span style="font-weight: 400;">"keycloak-js"</span><span style="font-weight: 400;">: </span><span style="font-weight: 400;">"^12.0.4"</span><span style="font-weight: 400;">,</span></pre>						</div>
				</div>
				<div class="elementor-element elementor-element-2699e08 elementor-widget elementor-widget-text-editor" data-id="2699e08" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Po zintegrowaniu nowej wersji Keycloak (26.1.0) ze starym frontendem klienta napotkaliśmy problem, który pojawiał się po zalogowaniu i objawiał się w następujący sposób:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-81f2826 elementor-widget elementor-widget-image" data-id="81f2826" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="480" height="317" src="https://inero-software.com/wp-content/uploads/2025/01/2025-01-28-480x317.png" class="attachment-septera-lpbox-2 size-septera-lpbox-2 wp-image-6801" alt="" data-attachment-id="6801" data-permalink="https://inero-software.com/keycloak-migration-made-easy-tips-and-best-practices/2025-01-28/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/01/2025-01-28.png" data-orig-size="538,317" 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="2025-01-28" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/01/2025-01-28-300x177.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/01/2025-01-28.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-91587be elementor-widget elementor-widget-text-editor" data-id="91587be" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Ta opcja określa, czy Keycloak powinien sprawdzać status logowania za pomocą iframe. Należy jej używać ostrożnie, ponieważ niewłaściwa konfiguracja może prowadzić do problemów, takich jak ciągłe przeładowywanie strony. Nowsze wersje Keycloak mogły ulepszyć lub zmienić sposób zarządzania sesjami, szczególnie w kontekście plików cookie typu cross-site, przepływów uwierzytelniania lub obsługi iframe (setupCheckLoginIframe, check3pCookiesSupported). Te zmiany mogą wpływać na sposób, w jaki frontend obsługuje stany logowania, zwłaszcza jeśli korzysta z przestarzałych metod sprawdzania statusów logowania lub przetwarzania callbacków.</p><p>Biorąc pod uwagę znaczną różnicę wersji między frontendem a serwerem, jednym z przydatnych rozwiązań może być wyłączenie opcji <strong>setupCheckLoginIframe</strong>, co może również pomóc w sytuacjach, gdy po aktualizacji występują nieskończone pętle przekierowań.</p><p>Oto przykład, jak wyłączyć tę opcję podczas inicjalizacji:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-f530026 elementor-widget elementor-widget-text-editor" data-id="f530026" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><span style="font-weight: 400;">function </span><span style="font-weight: 400;">initializeKeycloak</span><span style="font-weight: 400;">(keycloak: KeycloakService, permissionsService: PermissionsService) </span><br /><span style="font-weight: 400;">{</span><br /><span style="font-weight: 400;">  </span><span style="font-weight: 400;">return </span><span style="font-weight: 400;">() =&gt;</span><br /><span style="font-weight: 400;">    keycloak.</span><span style="font-weight: 400;">init</span><span style="font-weight: 400;">({</span><br /><br /><span style="font-weight: 400;">  </span> <span style="font-weight: 400;">config</span><span style="font-weight: 400;">: {</span><br /><span style="font-weight: 400;">    </span> <span style="font-weight: 400;">url</span><span style="font-weight: 400;">: </span><i><span style="font-weight: 400;">environment</span></i><span style="font-weight: 400;">.</span><span style="font-weight: 400;">keycloakUrl</span><span style="font-weight: 400;">,</span><br /><span style="font-weight: 400;">    </span> <span style="font-weight: 400;">realm</span><span style="font-weight: 400;">: </span><span style="font-weight: 400;">'test-realm'</span><span style="font-weight: 400;">,</span><br /><span style="font-weight: 400;">    </span> <span style="font-weight: 400;">clientId</span><span style="font-weight: 400;">: </span><span style="font-weight: 400;">'test-realm-web'</span><span style="font-weight: 400;">,</span><br /><span style="font-weight: 400;">  </span> <span style="font-weight: 400;">},</span><br /><span style="font-weight: 400;">  </span> <span style="font-weight: 400;">initOptions</span><span style="font-weight: 400;">: {</span><br /><span style="font-weight: 400;">        </span><span style="font-weight: 400;">checkLoginIframe</span><span style="font-weight: 400;">: </span><span style="font-weight: 400;">false</span><br /><span style="font-weight: 400;">  </span> <span style="font-weight: 400;">}</span><br /><span style="font-weight: 400;">}).</span><span style="font-weight: 400;">then</span><span style="font-weight: 400;">(() =&gt; permissionsService.</span><span style="font-weight: 400;">init</span><span style="font-weight: 400;">());</span><br /><span style="font-weight: 400;">}</span></pre>						</div>
				</div>
				<div class="elementor-element elementor-element-eaf0ada elementor-widget elementor-widget-heading" data-id="eaf0ada" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Brak klucza nonce w żądaniu</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-9e105aa elementor-widget elementor-widget-text-editor" data-id="9e105aa" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>W nowszych wersjach Keycloak, zgodnie ze specyfikacją OpenID Connect Core 1.0, klucz <strong>nonce</strong> jest teraz dodawany do tokena ID tylko wtedy, gdy parametr ten został uwzględniony w żądaniu autoryzacyjnym. Zgodnie ze specyfikacją, klucz <strong>nonce</strong> jest obowiązkowy w tokenie ID, ale nie powinien być zawarty w tokenach po żądaniu odświeżenia. Wcześniej klucz <strong>nonce</strong> był dodawany do wszystkich tokenów (Access, Refresh i ID) we wszystkich odpowiedziach, w tym także w odpowiedziach odświeżających.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-fc3ca51 elementor-widget elementor-widget-image" data-id="fc3ca51" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="512" height="300" src="https://inero-software.com/wp-content/uploads/2025/01/2025-01-28-2-512x300.png" class="attachment-septera-featured-third size-septera-featured-third wp-image-6802" alt="" data-attachment-id="6802" data-permalink="https://inero-software.com/keycloak-migration-made-easy-tips-and-best-practices/2025-01-28-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2025/01/2025-01-28-2.png" data-orig-size="716,448" 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="2025-01-28 -2" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2025/01/2025-01-28-2-300x188.png" data-large-file="https://inero-software.com/wp-content/uploads/2025/01/2025-01-28-2.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-8016f49 elementor-widget elementor-widget-text-editor" data-id="8016f49" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>W rezultacie korzystanie ze starszej wersji adaptera <strong>keycloak-js</strong> może powodować problemy z logowaniem, takie jak błędy &#8222;Invalid nonce, clearing token&#8221; lub nieskończone pętle przekierowań po próbach logowania. Aby rozwiązać ten problem, użytkownicy mogą dodać predefiniowany mapper <strong>&#8222;Nonce backwards compatible&#8221;</strong> za pomocą przycisku <strong>&#8222;By Configuration&#8221;</strong> w dedykowanym zakresie klienta. Więcej informacji można znaleźć w oficjalnej dokumentacji Keycloak (<a href="https://www.keycloak.org/docs/latest/upgrading/index.html#nonce-claim-is-only-added-to-the-id-token">https://www.keycloak.org/docs/latest/upgrading/index.html#nonce-claim-is-only-added-to-the-id-token</a>).</p>						</div>
				</div>
				<div class="elementor-element elementor-element-5c61c2e elementor-widget elementor-widget-heading" data-id="5c61c2e" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default"><strong style="text-indent: 0em;color: var( --e-global-color-primary );text-align: var(--text-align)">Problemy z przekierowaniem URI po wylogowaniu</strong></h3>		</div>
				</div>
				<div class="elementor-element elementor-element-26180df elementor-widget elementor-widget-text-editor" data-id="26180df" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Zgodnie z informacjami zawartymi w notatkach do wydania wersji 18, Keycloak nie obsługuje już parametru <strong>redirect_uri</strong> podczas wylogowywania. Zamiast tego należy używać parametru <strong>post_logout_redirect_uri</strong> wraz z parametrem <strong>client_id</strong> lub <strong>id_token_hint</strong>. W praktyce oznacza to, że podczas wywoływania funkcji wylogowania należy zastąpić <strong>redirect_uri</strong> parametrem <strong>post_logout_redirect_uri</strong>.</p><p>W naszym przypadku (przy użyciu starszej wersji <strong>keycloak-js</strong>) proces wylogowania można zaimplementować w następujący sposób:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-a8f685a elementor-widget elementor-widget-text-editor" data-id="a8f685a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><i><span style="font-weight: 400;">window</span></i><span style="font-weight: 400;">.</span><span style="font-weight: 400;">location</span><span style="font-weight: 400;">.</span><span style="font-weight: 400;">replace</span><span style="font-weight: 400;">(</span><span style="font-weight: 400;">this</span><span style="font-weight: 400;">.</span><span style="font-weight: 400;">keycloak</span><span style="font-weight: 400;">[</span><span style="font-weight: 400;">'_instance'</span><span style="font-weight: 400;">][</span><span style="font-weight: 400;">'endpoints'</span><span style="font-weight: 400;">].</span><span style="font-weight: 400;">logout</span><span style="font-weight: 400;">() +</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">   </span><span style="font-weight: 400;">'?post_logout_redirect_uri=' </span><span style="font-weight: 400;">+ </span><span style="font-weight: 400;">encodeURIComponent</span><span style="font-weight: 400;">(</span><i><span style="font-weight: 400;">window</span></i><span style="font-weight: 400;">.</span><span style="font-weight: 400;">location</span><span style="font-weight: 400;">.</span><span style="font-weight: 400;">origin</span><span style="font-weight: 400;">) +</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">   </span><span style="font-weight: 400;">'&amp;client_id=test-realm-web'</span><span style="font-weight: 400;">);</span></pre>						</div>
				</div>
				<div class="elementor-element elementor-element-d4ca7eb elementor-widget elementor-widget-text-editor" data-id="d4ca7eb" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Ta zmiana powinna rozwiązać najczęstsze problemy z przekierowaniami po wylogowaniu z aplikacji.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-20e2094 elementor-widget elementor-widget-heading" data-id="20e2094" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Podsumowanie</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-5633025 elementor-widget elementor-widget-text-editor" data-id="5633025" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>W ciągu ostatnich kilku lat Keycloak przeszedł znaczące zmiany, szczególnie te wprowadzone podczas migracji z WildFly na Quarkus. Zmiany te były konieczne dla poprawy wydajności, bardziej efektywnego wykorzystania zasobów oraz lepszej skalowalności.</p><p>Choć proces migracji może wydawać się trudny, jest on zazwyczaj wykonalny, nawet w przypadku starszych wersji. Stopień trudności migracji w dużej mierze zależy jednak od konkretnego przypadku, zwłaszcza od poziomu dostosowania. Na przykład, jeśli motywy były mocno zmodyfikowane w poprzedniej wersji Keycloak, ich dostosowanie do nowszych dystrybucji może wymagać więcej czasu i wysiłku, ponieważ struktura i silniki szablonów uległy zmianie.</p><p>Podobnie integracje z systemami starszej generacji mogą wymagać starannego planowania, aby zapewnić ich kompatybilność z nowszymi wersjami Keycloak. Z drugiej strony, w przypadku standardowych konfiguracji z minimalnym stopniem dostosowania, przejście na nową wersję jest zazwyczaj płynniejsze i szybsze. Proces migracji może być również wspierany przez szczegółową dokumentację oraz społeczność, która znacznie się rozwinęła w ostatnich latach.</p><p>Podsumowując, choć każdy projekt migracyjny niesie ze sobą własne wyzwania, to przy odpowiednim planowaniu i testowaniu przejście na nowszą wersję Keycloak zazwyczaj nie jest zbyt skomplikowane. Długoterminowe korzyści z aktualizacji, takie jak poprawiona wydajność i funkcje bezpieczeństwa, sprawiają, że wysiłek ten jest wart podjęcia.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-c667383 elementor-cta--skin-cover elementor-animated-content elementor-bg-transform elementor-bg-transform-zoom-in elementor-widget elementor-widget-call-to-action" data-id="c667383" data-element_type="widget" data-widget_type="call-to-action.default">
				<div class="elementor-widget-container">
					<div class="elementor-cta">
					<div class="elementor-cta__bg-wrapper">
				<div class="elementor-cta__bg elementor-bg" style="background-image: url(https://inero-software.com/wp-content/uploads/2024/12/1-1030x1030.png);" role="img" aria-label="1"></div>
				<div class="elementor-cta__bg-overlay"></div>
			</div>
							<div class="elementor-cta__content">
				
									<h2 class="elementor-cta__title elementor-cta__content-item elementor-content-item elementor-animated-item--grow">
						Planujesz aktualizację Keycloak?					</h2>
				
									<div class="elementor-cta__description elementor-cta__content-item elementor-content-item elementor-animated-item--grow">
						Jeśli szukasz partnera, który poprowadzi Cię przez proces aktualizacji to koniecznie skontaktuj się z nami. 					</div>
				
									<div class="elementor-cta__button-wrapper elementor-cta__content-item elementor-content-item elementor-animated-item--grow">
					<a class="elementor-cta__button elementor-button elementor-size-" href="https://calendar.app.google/CiGcgpfTyvVHDizZ8">
						Zaplanuj rozmowę					</a>
					</div>
							</div>
						</div>
				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-bece524 e-con-full e-flex e-con e-child" data-id="bece524" data-element_type="container">
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-54593f6 e-flex e-con-boxed e-con e-parent" data-id="54593f6" data-element_type="container">
					<div class="e-con-inner">
					</div>
				</div>
				</div>
		<p>Artykuł <a href="https://inero-software.com/pl/migracja-keycloak-porady-i-najlepsze-praktyki/">Migracja Keycloak: Porady i najlepsze praktyki</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6817</post-id>	</item>
		<item>
		<title>Praktyczne wprowadzenie do Keycloak SSO: Od konfiguracji do integracji</title>
		<link>https://inero-software.com/pl/praktyczne-wprowadzenie-do-keycloak-sso-od-konfiguracji-do-integracji/</link>
		
		<dc:creator><![CDATA[Marceli Formela]]></dc:creator>
		<pubDate>Tue, 17 Dec 2024 09:48:48 +0000</pubDate>
				<category><![CDATA[Firma]]></category>
		<category><![CDATA[Keycloak]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=6522</guid>

					<description><![CDATA[<p>SSO to protokół umożliwiający użytkownikom uwierzytelnianie i uzyskiwanie dostępu do wielu aplikacji za pomocą jednego zestawu danych logowania.</p>
<p>Artykuł <a href="https://inero-software.com/pl/praktyczne-wprowadzenie-do-keycloak-sso-od-konfiguracji-do-integracji/">Praktyczne wprowadzenie do Keycloak SSO: Od konfiguracji do integracji</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="6522" class="elementor elementor-6522" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-1493b19 e-flex e-con-boxed e-con e-parent" data-id="1493b19" data-element_type="container">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-68a6464 e-con-full e-flex e-con e-child" data-id="68a6464" data-element_type="container">
				</div>
		<div class="elementor-element elementor-element-c7adbf7 e-con-full e-flex e-con e-child" data-id="c7adbf7" data-element_type="container">
				<div class="elementor-element elementor-element-3a1b9b4 elementor-widget elementor-widget-html" data-id="3a1b9b4" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			 		</div>
				</div>
				<div class="elementor-element elementor-element-e6791c3 elementor-widget elementor-widget-text-editor" data-id="e6791c3" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4>Jedną z największych zalet, jakie Keycloak oferuje jest Single Sign-On (SSO). Funkcja ta znacząco usprawnia zarządzanie użytkownikami, upraszcza procesy uwierzytelniania w aplikacjach firmowych i stanowi skuteczne rozwiązanie w zakresie wyzwań związanych z bezpieczeństwem. Dziś przyjrzymy się, jak działa oraz jak skonfigurować przykładową integrację.</h4>						</div>
				</div>
				<div class="elementor-element elementor-element-fe586fe elementor-widget elementor-widget-heading" data-id="fe586fe" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">SSO (Single Sign-On)
</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-d084fd9 elementor-widget elementor-widget-text-editor" data-id="d084fd9" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>SSO to protokół umożliwiający użytkownikom uwierzytelnianie i uzyskiwanie dostępu do wielu aplikacji za pomocą jednego zestawu danych logowania. Takie podejście jest niezwykle wygodne, ponieważ eliminuje potrzebę zapamiętywania wielu haseł lub wielokrotnego logowania się. Co więcej, SSO zwiększa bezpieczeństwo, zmniejszając ryzyko związane ze słabymi, powtórnie używanymi lub zgubionymi hasłami.</p><p>Centrum SSO stanowi dostawca tożsamości (IdP), który działa jak centralny serwer uwierzytelniający. Gdy użytkownicy logują się do swojej pierwszej aplikacji, są przekierowywani do IdP, gdzie podają swoje dane uwierzytelniające. Po pomyślnym uwierzytelnieniu IdP inicjuje sesję SSO i generuje zaszyfrowany <strong>token</strong> dostępu, który aplikacja wykorzystuje do potwierdzenia tożsamości użytkownika.</p><p>Po aktywacji sesji SSO użytkownik może uzyskać dostęp do innych zaufanych aplikacji bez konieczności ponownego logowania. Kiedy druga aplikacja wymaga uwierzytelnienia, komunikuje się z IdP, który weryfikuje aktywną sesję użytkownika i wydaje kolejny token dostępu, umożliwiając płynny dostęp bez ponownego wprowadzania danych logowania.</p><p>Nowoczesne rozwiązania IAM ułatwiają implementację SSO w różnych aplikacjach, często wykorzystując otwarte standardy, takie jak OAuth 2.0 i OpenID Connect (OIDC). Standardy te umożliwiają uwierzytelnianie nie tylko w aplikacjach wewnętrznych, ale także w tych, które opierają się na zewnętrznych dostawcach tożsamości. Dodatkowo SSO obsługuje logowanie za pomocą mediów społecznościowych, co pozwala użytkownikom na uwierzytelnienie przy użyciu istniejących danych logowania z platform takich jak Google, Facebook czy Twitter.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-5109a8f elementor-widget elementor-widget-heading" data-id="5109a8f" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Typy SSO
</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-8c2be01 elementor-widget elementor-widget-text-editor" data-id="8c2be01" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Podczas wdrażania i zarządzania Single Sign-On (SSO) kluczowe jest zrozumienie różnych protokołów i standardów, które umożliwiają jego działanie. Do najczęściej stosowanych należą Security Assertion Markup Language (SAML) oraz OpenID Connect (OIDC). Keycloak obsługuje oba te protokoły, co czyni je głównym punktem naszej dyskusji. Warto jednak zauważyć, że inne protokoły, takie jak Kerberos, również odgrywają rolę w niektórych scenariuszach SSO.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-1110979 elementor-widget elementor-widget-heading" data-id="1110979" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">Security Access Markup Language (SAML)
</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-033ee93 elementor-widget elementor-widget-text-editor" data-id="033ee93" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>SAML to standard oparty na XML, zaprojektowany do kodowania i wymiany informacji o tożsamości pomiędzy aplikacjami. Stał się on fundamentem dla SSO, umożliwiając bezpieczne potwierdzanie żądań uwierzytelniania w aplikacjach internetowych. SAML 2.0, najczęściej stosowana wersja, jest zoptymalizowana specjalnie pod kątem środowisk przeglądarkowych, pozwalając na bezpieczne przekazywanie informacji o użytkownikach za pośrednictwem przeglądarek internetowych. Ze względu na swoją rozwlekłość i mniejszą efektywność przetwarzania danych w porównaniu do nowoczesnych standardów, SAML najlepiej sprawdza się w starszych oraz korporacyjnych aplikacjach internetowych, zwłaszcza tych działających wewnątrz organizacji.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-df47e79 elementor-widget elementor-widget-heading" data-id="df47e79" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">OpenID Connect (OIDC)
</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-43f4373 elementor-widget elementor-widget-text-editor" data-id="43f4373" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>OIDC to rozszerzenie protokołu OAuth 2.0, które dodaje informacje o użytkownikach i umożliwia SSO. Wykorzystuje JSON oraz RESTful API do wymiany danych, co sprawia, że jest szybkie i łatwe do integracji, zwłaszcza w środowiskach mobilnych i opartych na chmurze. OIDC jest szczególnie przydatne w scenariuszach związanych z logowaniem przez media społecznościowe (np. Google, Facebook) oraz zewnętrznymi interfejsami API. Jest to najlepszy wybór w sytuacjach, gdy aplikacje wymagają elastycznego, skalowalnego uwierzytelniania opartego na tokenach i zapewniającego wysoki poziom bezpieczeństwa.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-dbb4648 elementor-widget elementor-widget-heading" data-id="dbb4648" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Zalety i wady wdrożenia SSO</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-0582d73 elementor-widget elementor-widget-text-editor" data-id="0582d73" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Kluczowe korzyści Single Sign-On (SSO) to:</p><ul><li><strong>SSO ogranicza potrzebę zapamiętywania wielu nazw użytkowników i haseł</strong>, konsolidując uwierzytelnianie do jednego zestawu danych logowania.</li><li><strong>Redukuje liczbę resetów haseł i problemów z logowaniem</strong>, co zmniejsza obciążenie działu IT i prowadzi do oszczędności kosztów.</li><li><strong>Eliminuje przerwy spowodowane wielokrotnym logowaniem i zarządzaniem hasłami</strong>, pozwalając użytkownikom szybko uzyskać dostęp do potrzebnych zasobów i skupić się na zadaniach. Usprawnia proces logowania oraz umożliwia wylogowanie jednym kliknięciem z wielu aplikacji.</li><li><strong>Centralizacja danych użytkowników</strong> ułatwia administratorom zarządzanie i dostosowywanie uprawnień dostępu w całej sieci, zapewniając lepszą kontrolę.</li><li><strong>Konsolidacja danych logowania zmniejsza ryzyko związane ze słabym zarządzaniem hasłami</strong>. Administratorzy mogą łatwiej wyłączać konta w razie potrzeby, co podnosi ogólny poziom bezpieczeństwa.</li></ul><p>Podsumowując, <strong>SSO poprawia doświadczenie użytkowników, zwiększa produktywność, wzmacnia bezpieczeństwo i upraszcza zadania administracyjne</strong>, centralizując proces uwierzytelniania i ułatwiając zarządzanie dostępem.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-759f1f5 elementor-widget elementor-widget-text-editor" data-id="759f1f5" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><strong>Potencjalne wady SSO</strong></p><ul><li><p><strong>Pojedynczy punkt awarii (SPOF)</strong><br />Jeśli dostawca SSO doświadczy awarii lub zostanie naruszony, użytkownicy mogą utracić dostęp do wielu aplikacji jednocześnie.</p></li><li><p><strong>Złożoność wdrożenia</strong><br />Konfiguracja i utrzymanie systemu SSO może być technicznie wymagające, szczególnie w środowiskach zróżnicowanych pod względem aplikacji i protokołów. Nie wszystkie aplikacje natywnie obsługują SSO, co może wymagać niestandardowych integracji.</p></li><li><p><strong>Problemy ze skalowalnością</strong><br />W środowiskach o dużym ruchu system SSO musi obsługiwać znaczne obciążenia, co może wymagać dodatkowych zasobów oraz starannego planowania przyszłych integracji.</p></li></ul>						</div>
				</div>
				<div class="elementor-element elementor-element-e1a3472 elementor-widget elementor-widget-heading" data-id="e1a3472" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">SSO z Keycloak i Spring
</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-d4bf9a8 elementor-widget elementor-widget-text-editor" data-id="d4bf9a8" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Teraz omówimy, jak skonfigurować prosty mechanizm SSO przy użyciu Spring Security, biblioteki keycloak-angular oraz Keycloak jako dostawcy tożsamości. Wybór Keycloak jest podyktowany kilkoma czynnikami. Wykorzystuje on dobrze ugruntowany standard OpenID Connect, zapewniając szeroką kompatybilność. Wyróżnia się również dużą liczbą gotowych przykładów integracji zarówno dla aplikacji front-end, jak i back-end. Oferuje także znaczną elastyczność dzięki rozszerzeniom opartym na Javie, umożliwiając łatwą personalizację.</p><p>Aby uruchomić demo SSO, przejdziemy przez przygotowanie serwera autoryzacji, serwera zasobów oraz dwóch różnych aplikacji klienckich. Gdy użytkownik spróbuje uzyskać dostęp do zasobu jednej z aplikacji klienckich, powinien zostać przekierowany do serwera autoryzacji w celu uzyskania tokena. Keycloak zarządza procesem logowania, a po zalogowaniu użytkownika do pierwszej aplikacji klienckiej, jeśli uzyska on dostęp do drugiej aplikacji klienckiej z tej samej przeglądarki, nie będzie musiał logować się ponownie, ponieważ sesja SSO pozostaje aktywna. W tym przykładzie użyjemy klienta OIDC obsługującego OAuth2 oraz Authorization Code Flow do zarządzania procesem uwierzytelniania między punktami końcowymi.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-f0eb4d8 elementor-widget elementor-widget-image" data-id="f0eb4d8" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="1030" height="579" src="https://inero-software.com/wp-content/uploads/2024/12/KEYCLOCK7-1030x579.png" class="attachment-large size-large wp-image-6505" alt="" srcset="https://inero-software.com/wp-content/uploads/2024/12/KEYCLOCK7-1030x579.png 1030w, https://inero-software.com/wp-content/uploads/2024/12/KEYCLOCK7-300x169.png 300w, https://inero-software.com/wp-content/uploads/2024/12/KEYCLOCK7-768x432.png 768w, https://inero-software.com/wp-content/uploads/2024/12/KEYCLOCK7-1536x864.png 1536w, https://inero-software.com/wp-content/uploads/2024/12/KEYCLOCK7-533x300.png 533w, https://inero-software.com/wp-content/uploads/2024/12/KEYCLOCK7.png 1920w" sizes="(max-width: 1030px) 100vw, 1030px" data-attachment-id="6505" data-permalink="https://inero-software.com/hands-on-keycloak-sso-from-setup-to-integration/keyclock7/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/12/KEYCLOCK7.png" data-orig-size="1920,1080" 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="KEYCLOCK7" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/12/KEYCLOCK7-300x169.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/12/KEYCLOCK7-1030x579.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-a03fa44 elementor-widget elementor-widget-heading" data-id="a03fa44" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Serwer autoryzacji</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-46bf13a elementor-widget elementor-widget-text-editor" data-id="46bf13a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Do realizacji zadań dostawcy tożsamości (Identity Provider) lub serwera autoryzacji możemy wykorzystać obraz Dockera z najnowszą wersją Keycloak. Dzięki wdrożeniu za pomocą pliku <strong>docker-compose</strong> możemy szybko przygotować i skonfigurować środowisko, w tym bazę danych, bez potrzeby ręcznej instalacji. Prosta konfiguracja <strong>docker-compose</strong> będzie zawierać dwie usługi: <strong>Keycloak</strong> oraz bazę danych <strong>PostgreSQL</strong>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-b80ac6b elementor-widget elementor-widget-text-editor" data-id="b80ac6b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p><span style="font-weight: 400;">x-keycloak: &amp;keycloak</span></p><p><span style="font-weight: 400;">  build: keycloak</span></p><p><span style="font-weight: 400;">  ports:</span></p><p><span style="font-weight: 400;">&#8211; &#8222;8080:8080&#8221;</span></p><p><span style="font-weight: 400;">  depends_on:</span></p><p><span style="font-weight: 400;">&#8211; db-postgres-keycloak</span></p><p><span style="font-weight: 400;"> </span></p><p><span style="font-weight: 400;">x-common-variables: &amp;common-variables</span></p><p><span style="font-weight: 400;">  KC_BOOTSTRAP_ADMIN_USERNAME: admin</span></p><p><span style="font-weight: 400;">  KC_BOOTSTRAP_ADMIN_PASSWORD: admin</span></p><p><span style="font-weight: 400;">  KC_HOSTNAME_STRICT: &#8222;false&#8221;</span></p><p><span style="font-weight: 400;">  KC_HTTP_RELATIVE_PATH: /auth</span></p><p><span style="font-weight: 400;">  KC_HTTP_ENABLED: 'true&#8217;</span></p><p><span style="font-weight: 400;">  KC_LOG_LEVEL: &#8222;INFO,io.quarkus.http.access-log:DEBUG&#8221;</span></p><p><span style="font-weight: 400;">  KC_DB: postgres</span></p><p><span style="font-weight: 400;">  KC_DB_URL_HOST: db-postgres-keycloak</span></p><p><span style="font-weight: 400;">  KC_DB_USERNAME: keycloak</span></p><p><span style="font-weight: 400;">  KC_DB_PASSWORD: password</span></p><p><span style="font-weight: 400;">  KC_DB_SCHEMA: public</span></p><p><span style="font-weight: 400;">  QUARKUS_HTTP_ACCESS_LOG_ENABLED: 'true&#8217;</span></p><p><span style="font-weight: 400;">services:</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">   keycloak:</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">          &lt;&lt;: *keycloak</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">         environment:</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">        </span> <span style="font-weight: 400;">&lt;&lt;: *common-variables</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">       profiles: [&#8222;example&#8221;]</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">      command: start &#8211;optimized</span></p><p><span style="font-weight: 400;">db-postgres-keycloak:</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">      profiles: [&#8222;example&#8221;]</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">      image: postgres:15</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">      environment:</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">     </span> <span style="font-weight: 400;">POSTGRES_USER: keycloak</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">      </span><span style="font-weight: 400;">POSTGRES_PASSWORD: password</span><span style="font-weight: 400;"><br /></span><span style="font-weight: 400;">     </span> <span style="font-weight: 400;">POSTGRES_DB: keycloak</span></p>						</div>
				</div>
				<div class="elementor-element elementor-element-2db7c3a elementor-widget elementor-widget-text-editor" data-id="2db7c3a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Po uruchomieniu kontenerów możemy zalogować się do konsoli administracyjnej (dostępnej pod adresem <strong><a href="http://localhost:8080" target="_new" rel="noopener">http://localhost:8080</a></strong>). Zanim jednak przejdziemy do konfiguracji klientów w ramach realm, warto poświęcić chwilę na zapoznanie się z ustawieniami w sekcji <strong>Realm Settings -&gt; Sessions</strong>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-76e1efc elementor-widget elementor-widget-heading" data-id="76e1efc" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">SSO konfiguracja sesji</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-143c327 elementor-widget elementor-widget-image" data-id="143c327" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="605" height="351" src="https://inero-software.com/wp-content/uploads/2024/12/Obraz1.png" class="attachment-large size-large wp-image-6507" alt="" srcset="https://inero-software.com/wp-content/uploads/2024/12/Obraz1.png 605w, https://inero-software.com/wp-content/uploads/2024/12/Obraz1-300x174.png 300w, https://inero-software.com/wp-content/uploads/2024/12/Obraz1-517x300.png 517w" sizes="(max-width: 605px) 100vw, 605px" data-attachment-id="6507" data-permalink="https://inero-software.com/hands-on-keycloak-sso-from-setup-to-integration/obraz1-3/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz1.png" data-orig-size="605,351" 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="Obraz1" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz1-300x174.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz1.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-21c6e4e elementor-widget elementor-widget-text-editor" data-id="21c6e4e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Podczas konfigurowania nowego realm możemy dostosować ustawienia zarządzania sesjami, aby zrównoważyć bezpieczeństwo i wygodę użytkowników. Ustawienia te określają, jak długo użytkownicy pozostają uwierzytelnieni oraz warunki, w których muszą ponownie się zalogować. Poniżej opisujemy najważniejsze z nich:</p><ul><li><p><strong>SSO Session Idle</strong> – to ustawienie kontroluje, jak długo użytkownik może pozostawać nieaktywny, zanim jego sesja wygaśnie. Jeśli użytkownik nie podejmie żadnej aktywności przez określony czas, będzie musiał ponownie się uwierzytelnić przy następnej interakcji z aplikacją. Licznik jest resetowany, gdy klient wysyła żądania odświeżenia tokena.</p></li><li><p><strong>SSO Session Max</strong> – parametr ten definiuje maksymalny czas trwania sesji, niezależnie od aktywności użytkownika. Gdy sesja przekroczy ten czas, użytkownik zostanie wylogowany i poproszony o ponowne zalogowanie się.</p></li><li><p><strong>SSO Session Idle Remember Me</strong> oraz <strong>SSO Session Max Remember Me</strong> – działają podobnie jak parametry SSO Session, ale odnoszą się do sytuacji, gdy użytkownik zaznaczył opcję <em>Remember Me</em> (Zapamiętaj mnie).</p></li><li><p><strong>Client Session Idle</strong> oraz <strong>Client Session Max</strong> – te parametry powinny mieć krótsze wartości czasu niż ogólne ustawienia SSO. Określają one maksymalny okres ważności tokena odświeżania i mogą być nadpisane dla poszczególnych klientów w ich ustawieniach.</p></li></ul><p>Dostosowanie tych ustawień pozwala precyzyjnie zarządzać sesjami użytkowników, zwiększając kontrolę nad bezpieczeństwem aplikacji oraz optymalizując doświadczenie użytkowników.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-67f3943 elementor-widget elementor-widget-heading" data-id="67f3943" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Serwer zasobów</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-1ecb54b elementor-widget elementor-widget-text-editor" data-id="1ecb54b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Jednym z klientów realm będzie <strong>serwer zasobów</strong>, który pełni podwójną rolę – jako klient Keycloak oraz backend dla dwóch różnych aplikacji uczestniczących w opisanym przepływie. Proces integracji aplikacji <strong>Spring Boot</strong> z Keycloak jest bardzo podobny do tego, który opisaliśmy w jednym z wcześniejszych wpisów (https://inero-software.com/pl/zabezpieczanie-punktow-koncowych-java-spring-za-pomoca-keycloak/).</p><p>Dlatego nie będziemy tutaj skupiać się na samej aplikacji Java. Skonfigurowany w ten sposób <strong>serwer zasobów</strong> będzie wystawiał przykładowy endpoint dostępny tylko dla użytkowników uwierzytelnionych w ramach tego realm.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-0d382ce elementor-widget elementor-widget-image" data-id="0d382ce" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="605" height="363" src="https://inero-software.com/wp-content/uploads/2024/12/Obraz2.png" class="attachment-large size-large wp-image-6508" alt="" srcset="https://inero-software.com/wp-content/uploads/2024/12/Obraz2.png 605w, https://inero-software.com/wp-content/uploads/2024/12/Obraz2-300x180.png 300w, https://inero-software.com/wp-content/uploads/2024/12/Obraz2-500x300.png 500w" sizes="(max-width: 605px) 100vw, 605px" data-attachment-id="6508" data-permalink="https://inero-software.com/hands-on-keycloak-sso-from-setup-to-integration/obraz2-2/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz2.png" data-orig-size="605,363" 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="Obraz2" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz2-300x180.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz2.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-52acd2b elementor-widget elementor-widget-text-editor" data-id="52acd2b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Serwer zasobów musi zarządzać zasobami w ramach <strong>realm</strong>, dlatego w Keycloak należy zaznaczyć opcję <strong>Authorization</strong>. To ustawienie jest przeznaczone głównie dla serwerów zasobów, które potrzebują dostępu do różnych endpointów, takich jak <strong>Token Endpoint</strong>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-addf1cd elementor-widget elementor-widget-image" data-id="addf1cd" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="605" height="344" src="https://inero-software.com/wp-content/uploads/2024/12/Obraz3.png" class="attachment-large size-large wp-image-6509" alt="" srcset="https://inero-software.com/wp-content/uploads/2024/12/Obraz3.png 605w, https://inero-software.com/wp-content/uploads/2024/12/Obraz3-300x171.png 300w, https://inero-software.com/wp-content/uploads/2024/12/Obraz3-528x300.png 528w" sizes="(max-width: 605px) 100vw, 605px" data-attachment-id="6509" data-permalink="https://inero-software.com/hands-on-keycloak-sso-from-setup-to-integration/obraz3/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz3.png" data-orig-size="605,344" 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="Obraz3" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz3-300x171.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz3.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-fe85f67 elementor-widget elementor-widget-text-editor" data-id="fe85f67" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>W tej konfiguracji klient jest ustawiony jako <strong>confidential</strong> (poufny) z sekretem, który musi być współdzielony zarówno przez serwer Keycloak, jak i samą aplikację. Sekret można wygenerować w <strong>Admin Console</strong>, a następnie umieścić go w pliku <strong>application.properties</strong> aplikacji Spring, aby zapewnić bezpieczną komunikację.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-b86fa97 elementor-widget elementor-widget-image" data-id="b86fa97" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="605" height="367" src="https://inero-software.com/wp-content/uploads/2024/12/Obraz4.png" class="attachment-large size-large wp-image-6510" alt="" srcset="https://inero-software.com/wp-content/uploads/2024/12/Obraz4.png 605w, https://inero-software.com/wp-content/uploads/2024/12/Obraz4-300x182.png 300w, https://inero-software.com/wp-content/uploads/2024/12/Obraz4-495x300.png 495w" sizes="(max-width: 605px) 100vw, 605px" data-attachment-id="6510" data-permalink="https://inero-software.com/hands-on-keycloak-sso-from-setup-to-integration/obraz4/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz4.png" data-orig-size="605,367" 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="Obraz4" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz4-300x182.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz4.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-6074115 elementor-widget elementor-widget-text-editor" data-id="6074115" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Pozostałe pola formularza można pozostawić z domyślnymi wartościami.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-faa8b15 elementor-widget elementor-widget-heading" data-id="faa8b15" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Frontend clients
</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-78fd29c elementor-widget elementor-widget-text-editor" data-id="78fd29c" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Konfiguracja klientów frontendu jest dość podobna do poprzedniej, jednak warto zwrócić uwagę na pewne różnice. W przypadku klientów działających w przeglądarce <strong>nie ustawiamy ich jako confidential</strong>. Opcja <strong>„Authorization”</strong> również <strong>nie jest tutaj wymagana</strong>. Kluczowym aspektem jest właściwa konfiguracja <strong>Redirect URIs</strong> oraz <strong>Web Origins</strong>. Zazwyczaj mogą one być takie same, co zapewnia, że Keycloak prawidłowo rozpozna dozwolone źródła, z których aplikacja frontendowa może wykonywać żądania.</p><p>Jednak nie zaleca się polegania na <strong>wildcardach (*)</strong> w <strong>Redirect URIs</strong>. Najnowsza specyfikacja <strong>OAuth 2.1</strong> wymaga, aby URI były porównywane przy użyciu <strong>dokładnego dopasowania ciągu znaków</strong>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-c99d969 elementor-widget elementor-widget-image" data-id="c99d969" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="605" height="292" src="https://inero-software.com/wp-content/uploads/2024/12/Obraz5.png" class="attachment-large size-large wp-image-6511" alt="" srcset="https://inero-software.com/wp-content/uploads/2024/12/Obraz5.png 605w, https://inero-software.com/wp-content/uploads/2024/12/Obraz5-300x145.png 300w" sizes="(max-width: 605px) 100vw, 605px" data-attachment-id="6511" data-permalink="https://inero-software.com/hands-on-keycloak-sso-from-setup-to-integration/obraz5/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz5.png" data-orig-size="605,292" 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="Obraz5" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz5-300x145.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz5.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-16b0b05 elementor-widget elementor-widget-image" data-id="16b0b05" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
													<img loading="lazy" decoding="async" width="594" height="311" src="https://inero-software.com/wp-content/uploads/2024/12/Obraz6.png" class="attachment-large size-large wp-image-6512" alt="" srcset="https://inero-software.com/wp-content/uploads/2024/12/Obraz6.png 594w, https://inero-software.com/wp-content/uploads/2024/12/Obraz6-300x157.png 300w, https://inero-software.com/wp-content/uploads/2024/12/Obraz6-573x300.png 573w" sizes="(max-width: 594px) 100vw, 594px" data-attachment-id="6512" data-permalink="https://inero-software.com/hands-on-keycloak-sso-from-setup-to-integration/obraz6/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz6.png" data-orig-size="594,311" 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="Obraz6" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz6-300x157.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/12/Obraz6.png" role="button" />													</div>
				</div>
				<div class="elementor-element elementor-element-74de000 elementor-widget elementor-widget-text-editor" data-id="74de000" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Aby uwierzytelnić użytkownika i wyświetlić stronę logowania Keycloak w naszym projekcie Angular, użyjemy <strong>Injection Token</strong>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-ca70eb2 elementor-widget elementor-widget-text-editor" data-id="ca70eb2" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><span style="font-weight: 400;">function initializeKeycloak(keycloak: KeycloakService) {</span><br /><span style="font-weight: 400;">return () =&gt;</span><br /><span style="font-weight: 400;">    </span> <span style="font-weight: 400;">keycloak.init({</span><br /><span style="font-weight: 400;">        </span> <span style="font-weight: 400;">config: {</span><br /><span style="font-weight: 400;">            </span> <span style="font-weight: 400;">url: </span><i><span style="font-weight: 400;">environment</span></i><span style="font-weight: 400;">.keycloakUrl,</span><br /><span style="font-weight: 400;">          </span> <span style="font-weight: 400;">  realm: 'sso-realm',</span><br /><span style="font-weight: 400;">            </span> <span style="font-weight: 400;">clientId: 'sso-app-1',</span><br /><span style="font-weight: 400;">        </span> <span style="font-weight: 400;">},</span><br /><span style="font-weight: 400;">        </span> <span style="font-weight: 400;">initOptions: {</span><br /><span style="font-weight: 400;">            </span> <span style="font-weight: 400;">checkLoginIframe: false,</span><br /><span style="font-weight: 400;">            </span> <span style="font-weight: 400;">scope: 'sso-resource-server'</span><br /><span style="font-weight: 400;">        </span> <span style="font-weight: 400;">}</span><br /><span style="font-weight: 400;">    </span> <span style="font-weight: 400;">});</span><br /><span style="font-weight: 400;">}</span></pre>						</div>
				</div>
				<div class="elementor-element elementor-element-c885d0e elementor-widget elementor-widget-text-editor" data-id="c885d0e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Powyższa funkcja przyjmuje jako argument <strong>KeycloakService</strong>, czyli obiekt z biblioteki <strong>keycloak-angular</strong>, dzięki czemu możemy go skonfigurować, podając URL serwera, nazwę realm oraz identyfikator klienta aplikacji, który został utworzony w poprzednim kroku. Następnie musimy zarejestrować tę funkcję w pliku <strong>app.module.ts</strong> jako <strong>provider</strong>:</p>						</div>
				</div>
				<div class="elementor-element elementor-element-dda523b elementor-widget elementor-widget-text-editor" data-id="dda523b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><span style="font-weight: 400;">providers: [</span><br /><span style="font-weight: 400;">     {</span><br /><span style="font-weight: 400;">    </span> <span style="font-weight: 400;">provide: </span><i><span style="font-weight: 400;">APP_INITIALIZER</span></i><span style="font-weight: 400;">,</span><br /><span style="font-weight: 400;">    </span> <span style="font-weight: 400;">useFactory: initializeKeycloak,</span><br /><span style="font-weight: 400;">    </span> <span style="font-weight: 400;">multi: true,</span><br /><span style="font-weight: 400;">    </span> <span style="font-weight: 400;">deps: [KeycloakService],</span><br /><span style="font-weight: 400;">     },</span><br /><span style="font-weight: 400;">],</span></pre>						</div>
				</div>
				<div class="elementor-element elementor-element-c73de49 elementor-widget elementor-widget-text-editor" data-id="c73de49" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Kolejnym krokiem będzie utworzenie <strong>Guard</strong>, który zabezpieczy ścieżki w aplikacji. Biblioteka, której używamy, dostarcza już wstępnie skonfigurowaną, abstrakcyjną klasę <strong>KeycloakAuthGuard</strong>, którą rozszerzymy, tworząc własny Guard. Następnie musimy nadpisać metodę <strong>isAccessAllowed</strong>.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-79eb23e elementor-widget elementor-widget-text-editor" data-id="79eb23e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<pre><span style="font-weight: 400;">public async isAccessAllowed(</span><br /><span style="font-weight: 400;">      route: ActivatedRouteSnapshot,</span><br /><span style="font-weight: 400;">      state: RouterStateSnapshot</span><br /><br /><span style="font-weight: 400;">) {</span><br /><br /><span style="font-weight: 400;">     // Force the user to log in if currently unauthenticated.</span><br /><span style="font-weight: 400;">    if (!this.authenticated) {</span><br /><span style="font-weight: 400;">    </span><span style="font-weight: 400;">await this.keycloak.login({</span><br /><span style="font-weight: 400;">   </span> <span style="font-weight: 400;">redirectUri: </span><i><span style="font-weight: 400;">window</span></i><span style="font-weight: 400;">.location.origin + '/#/' + state.url</span><br /><span style="font-weight: 400;">    </span> <span style="font-weight: 400;">});<br /></span><br /><span style="font-weight: 400;">     }</span><br /><span style="font-weight: 400;">    // Get the roles required from the route.</span><br /><span style="font-weight: 400;">    const requiredRoles = route.data['roles'];<br /></span><br /><span style="font-weight: 400;">   // Allow the user to proceed if no additional roles are required to access the route.</span><br /><span style="font-weight: 400;">   if (!(requiredRoles instanceof </span><i><span style="font-weight: 400;">Array</span></i><span style="font-weight: 400;">) || requiredRoles.length === 0) {</span><br /><span style="font-weight: 400;">   </span><span style="font-weight: 400;">return true;<br /></span><span style="font-weight: 400;">   }</span><br /><br /><span style="font-weight: 400;">   // Allow the user to proceed if all the required roles are present.</span><br /><span style="font-weight: 400;">  return requiredRoles.every((role) =&gt; this.roles.includes(role));</span><br /><span style="font-weight: 400;">}</span></pre>						</div>
				</div>
				<div class="elementor-element elementor-element-cd7644e elementor-widget elementor-widget-text-editor" data-id="cd7644e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Następnie musimy przypisać <strong>AuthGuard</strong> do określonych ścieżek w module routingu. Po poprawnej konfiguracji wszystkich komponentów biblioteki <strong>keycloak-angular</strong>, użytkownik powinien zostać przekierowany na stronę logowania Keycloak, a po pomyślnej autoryzacji uzyska dostęp do chronionych zasobów.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-b82d617 elementor-widget elementor-widget-heading" data-id="b82d617" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Test i podsumowanie </h3>		</div>
				</div>
				<div class="elementor-element elementor-element-f2e9274 elementor-widget elementor-widget-text-editor" data-id="f2e9274" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Aby przetestować funkcjonalność SSO, uruchom serwer zasobów (aplikację Spring) oraz oba klientów działających w przeglądarce. Gdy wszystkie komponenty będą działały, otwórz przeglądarkę i zaloguj się do jednej z aplikacji frontendowych. Następnie otwórz nową kartę lub okno i przejdź do drugiej aplikacji Angular. Po kliknięciu przycisku logowania powinieneś zostać bezpośrednio przekierowany do aplikacji i uzyskać dostęp do chronionego endpointu.</p><p>W ten sposób można zobaczyć, jak wbudowane funkcje Keycloak upraszczają zarządzanie uprawnieniami dostępu. Wykorzystując Keycloak jako <strong>dostawcę tożsamości (Identity Provider)</strong>, możemy skonfigurować system, w którym użytkownicy muszą zalogować się tylko raz, aby uzyskać dostęp do różnych połączonych aplikacji. Centralizując dane logowania użytkowników, zwiększamy zarówno <strong>bezpieczeństwo</strong>, jak i <strong>doświadczenie użytkownika</strong>, a także ograniczamy ryzyko związane z podatnościami wynikającymi z haseł.</p>						</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-bfd0f02 e-con-full e-flex e-con e-child" data-id="bfd0f02" data-element_type="container">
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-31ecbdd e-flex e-con-boxed e-con e-parent" data-id="31ecbdd" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-3a7057f elementor-cta--skin-classic elementor-animated-content elementor-bg-transform elementor-bg-transform-zoom-in elementor-widget elementor-widget-call-to-action" data-id="3a7057f" data-element_type="widget" data-widget_type="call-to-action.default">
				<div class="elementor-widget-container">
					<div class="elementor-cta">
					<div class="elementor-cta__bg-wrapper">
				<div class="elementor-cta__bg elementor-bg" style="background-image: url(https://inero-software.com/wp-content/uploads/2024/12/tlo-popup-keycloak-2-1030x731.png);" role="img" aria-label="tło popup keycloak (2)"></div>
				<div class="elementor-cta__bg-overlay"></div>
			</div>
							<div class="elementor-cta__content">
				
									<h2 class="elementor-cta__title elementor-cta__content-item elementor-content-item">
						Jeśli Twoja firma potrzebuje pomocy przy wdrożeniu systemu IAM					</h2>
				
									<div class="elementor-cta__description elementor-cta__content-item elementor-content-item">
						skontaktuj się z nami. Posiadamy bogate portfolio zrealizowanych projektów. 					</div>
				
									<div class="elementor-cta__button-wrapper elementor-cta__content-item elementor-content-item ">
					<a class="elementor-cta__button elementor-button elementor-size-" href="https://inero-software.com/pl/kontakt/">
						Napisz do nas					</a>
					</div>
							</div>
						</div>
				</div>
				</div>
					</div>
				</div>
				</div>
		<p>Artykuł <a href="https://inero-software.com/pl/praktyczne-wprowadzenie-do-keycloak-sso-od-konfiguracji-do-integracji/">Praktyczne wprowadzenie do Keycloak SSO: Od konfiguracji do integracji</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6522</post-id>	</item>
		<item>
		<title>Keycloak: wskazówki dotyczące monitorowania i ochrony przy użyciu wbudowanych narzędzi konfiguracyjnych</title>
		<link>https://inero-software.com/pl/keycloak-wskazowki-dotyczace-monitorowania-i-ochrony-przy-uzyciu-wbudowanych-narzedzi-konfiguracyjnych/</link>
		
		<dc:creator><![CDATA[Marceli Formela]]></dc:creator>
		<pubDate>Thu, 26 Sep 2024 10:43:22 +0000</pubDate>
				<category><![CDATA[Blog_pl]]></category>
		<category><![CDATA[Firma]]></category>
		<category><![CDATA[Technologie]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=6192</guid>

					<description><![CDATA[<p>Keycloak to nie tylko potężne narzędzie do zarządzania tożsamością i dostępem; jest również kluczowe dla monitorowania wydajności i zwiększania bezpieczeństwa, zwłaszcza w obronie przed atakami phishingowymi. Dzięki wbudowanym mechanizmom monitorowania i alertowania, administratorzy mogą wykrywać podejrzane działania użytkowników oraz utrzymywać optymalną wydajność systemu. Andrzej Chybicki CEO Inero Software Usługi Keycloak:&#8230;</p>
<p>Artykuł <a href="https://inero-software.com/pl/keycloak-wskazowki-dotyczace-monitorowania-i-ochrony-przy-uzyciu-wbudowanych-narzedzi-konfiguracyjnych/">Keycloak: wskazówki dotyczące monitorowania i ochrony przy użyciu wbudowanych narzędzi konfiguracyjnych</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="6192" class="elementor elementor-6192" 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>Keycloak to nie tylko potężne narzędzie do zarządzania tożsamością i dostępem; jest również kluczowe dla monitorowania wydajności i zwiększania bezpieczeństwa, zwłaszcza w obronie przed atakami phishingowymi. Dzięki wbudowanym mechanizmom monitorowania i alertowania, administratorzy mogą wykrywać podejrzane działania użytkowników oraz utrzymywać optymalną wydajność systemu.</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/pl/keycloak/" target="_blank" rel="noopener " class="e-link-in-bio__cta is-type-button has-corners-rounded">
										<span class="e-link-in-bio__cta-text">
						 Usługi Keycloak: Kompleksowa implementacja, utrzymanie i szkolenia					</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>Wydajność Keycloak: Monitorowanie z Grafaną</h4><p>Monitorowanie wydajności Keycloak jest kluczowe, zwłaszcza w dużych organizacjach, gdzie system musi obsługiwać jednocześnie tysiące użytkowników. Ciekawym narzędziem do tego celu jest na przykład Aerogear (https://github.com/aerogear/keycloak-metrics-spi). Aerogear umożliwia łatwe śledzenie krytycznych metryk w czasie rzeczywistym, co pozwala na optymalizację systemu i skalowanie.</p><p>Aerogear zapewnia dwie kluczowe funkcje: <strong>MetricsEventListener</strong> i <strong>MetricsEndpoint,</strong> które umożliwiają przesyłanie zdarzeń Keycloak do Prometheus oraz integrację z narzędziami wizualizacyjnymi, takimi jak Grafana. Dzięki temu administratorzy mogą monitorować ważne metryki, takie jak:</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><span style="color: #800080;">Zużycie pamięci,</span></li><li><span style="color: #800080;">Liczba zalogowanych użytkowników (według realm, klienta, globalnie, itp.),</span></li><li><span style="color: #800080;">Błędy logowania.</span></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>Grafana oferuje wysoki poziom dostosowywania, umożliwiając dodanie niestandardowych parametrów (np. z plików CSV lub baz danych) oraz konfigurację alertów. Te alerty mogą być wywoływane przez różne czynniki, takie jak:</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;">Przekroczenie limitu czasu logowania,</span></li><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;">Logowanie z nieautoryzowanych lokalizacji,</span></li><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;">Niezwykle duża liczba żądań resetowania hasła.</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" 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">żródło: 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>Ochrona przed atakami phishingowymi: Mechanizmy adaptacyjnego uwierzytelniania</h4><p>Oprócz monitorowania wydajności, zaawansowane wbudowane funkcje bezpieczeństwa Keycloak pomagają chronić przed atakami phishingowymi poprzez analizę wzorców zdarzeń. Zdarzenia w Keycloak umożliwiają administratorom definiowanie niestandardowych odpowiedzi na określone działania użytkowników, takie jak resetowanie hasła po nieudanych próbach logowania — często będące wskaźnikiem aktywności phishingowej.</p><p>Przykładem funkcji bezpieczeństwa jest <strong>adaptacyjne uwierzytelnianie</strong>, które modyfikuje proces logowania użytkownika na podstawie wcześniejszych zachowań. Na przykład, jeśli użytkownik prosi o zresetowanie hasła bez wcześniejszych nieudanych prób logowania, system może uruchomić dodatkowy krok uwierzytelnienia, taki jak uwierzytelnianie dwuskładnikowe (2FA).</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>Tworzenie i dostosowywanie polityki bezpieczeństwa</h4><p>Podczas wdrażania tych funkcji kluczowe jest określenie, kiedy działania użytkownika powinny budzić podejrzenia. Na przykład resetowanie hasła bez wcześniejszych nieudanych prób logowania może sygnalizować phishing, podczas gdy reset po wielu nieudanych logowaniach jest bardziej rutynowy. Można zdefiniować niestandardową politykę bezpieczeństwa, która będzie określać: „<em>Jeśli użytkownik żąda resetowania hasła bez nieudanych logowań w ciągu ostatnich 3 minut, wymagana jest autoryzacja 2FA</em>”.</p><p>Te mechanizmy adaptacyjnego uwierzytelniania zmniejszają obciążenie wynikające z wieloskładnikowego uwierzytelniania (MFA), jednocześnie utrzymując wysoki poziom bezpieczeństwa. Dzięki skonfigurowaniu systemu zdarzeń i alertów w Keycloak, organizacje mogą skuteczniej wykrywać nietypowe zachowania i szybciej reagować na potencjalne zagrożenia.</p><p>Keycloak to wszechstronne narzędzie, które wspiera zarówno monitorowanie wydajności, jak i zwiększone bezpieczeństwo. Integracja z narzędziami takimi jak Grafana pozwala administratorom śledzić kluczowe parametry systemowe, a zaawansowane mechanizmy oparte na zdarzeniach oraz adaptacyjne uwierzytelnianie wzmacniają ochronę przed phishingiem i innymi zagrożeniami. Odpowiednia konfiguracja tych funkcji może znacznie zwiększyć poziom bezpieczeństwa i poprawić czas reakcji na incydenty.</p>						</div>
				</div>
				</div>
					</div>
				</div>
				</div>
		<p>Artykuł <a href="https://inero-software.com/pl/keycloak-wskazowki-dotyczace-monitorowania-i-ochrony-przy-uzyciu-wbudowanych-narzedzi-konfiguracyjnych/">Keycloak: wskazówki dotyczące monitorowania i ochrony przy użyciu wbudowanych narzędzi konfiguracyjnych</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6192</post-id>	</item>
		<item>
		<title>Przewodnik integracji Keycloak: Logowanie przez platformy społecznościowe</title>
		<link>https://inero-software.com/pl/przewodnik-integracji-keycloak-logowanie-przez-platformy-spolecznosciowe/</link>
		
		<dc:creator><![CDATA[Marceli Formela]]></dc:creator>
		<pubDate>Wed, 11 Sep 2024 13:42:01 +0000</pubDate>
				<category><![CDATA[Blog_pl]]></category>
		<category><![CDATA[Firma]]></category>
		<category><![CDATA[keycloak]]></category>
		<category><![CDATA[logowanie]]></category>
		<category><![CDATA[społecznościowe]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=6115</guid>

					<description><![CDATA[<p>&#160;</p>
<p>Artykuł <a href="https://inero-software.com/pl/przewodnik-integracji-keycloak-logowanie-przez-platformy-spolecznosciowe/">Przewodnik integracji Keycloak: Logowanie przez platformy społecznościowe</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>&nbsp;</p>
<div class="row"><div class="col-sm-1"></div><div class="col-sm-10">
<h4>W poprzedniej publikacji pokazaliśmy, jak wdrożyć niestandardowe motywy w Keycloak i jak mogą one pomóc w zapobieganiu atakom phishingowym. W tym razem skupimy się na tym, jak włączyć logowanie społecznościowe za pomocą Keycloak, przedstawiając krok po kroku integrację z platformami, takimi jak Google. Niezależnie od tego, czy chcesz uprościć uwierzytelnianie, czy zwiększyć bezpieczeństwo, ten wpis przeprowadzi Cię przez kluczowe kroki konfiguracji i zarządzania logowaniem społecznościowym w Twojej aplikacji.</h4>
<p>&nbsp;</p>
<h3><b>Jak to działa</b></h3>
<p>Ogólna idea logowania społecznościowego jest dość prosta jako koncept: kiedy użytkownicy uzyskują dostęp do naszej aplikacji, mogą wybrać dostawcę sieci społecznościowej, takiego jak Google lub Facebook, do uwierzytelnienia zamiast ręcznego definiowania loginów i haseł. Następnie aplikacja wysyła żądanie logowania do wybranej platformy, a po potwierdzeniu tożsamości użytkownika przez sieć społecznościową, użytkownik uzyskuje dostęp do aplikacji i jest natychmiast zalogowany.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-6097 size-full" src="https://inero-software.com/wp-content/uploads/2024/09/8.png" alt="" width="1920" height="1080" srcset="https://inero-software.com/wp-content/uploads/2024/09/8.png 1920w, https://inero-software.com/wp-content/uploads/2024/09/8-300x169.png 300w, https://inero-software.com/wp-content/uploads/2024/09/8-1030x579.png 1030w, https://inero-software.com/wp-content/uploads/2024/09/8-768x432.png 768w, https://inero-software.com/wp-content/uploads/2024/09/8-1536x864.png 1536w, https://inero-software.com/wp-content/uploads/2024/09/8-533x300.png 533w" sizes="(max-width: 1920px) 100vw, 1920px" /></p>
<ol>
<li style="font-weight: 400;" aria-level="1">Użytkownik, który nie jest jeszcze uwierzytelniony, próbuje uzyskać dostęp do chronionego zasobu w aplikacji klienckiej. Aplikacja przekierowuje przeglądarkę do Keycloak, który działa jako pośrednik tożsamości, a następnie ponownie przekierowuje użytkownika do jednego z dostawców tożsamości.</li>
<li style="font-weight: 400;" aria-level="1">Na stronie logowania prezentowana jest lista dostępnych dostawców tożsamości (takich jak Google, Facebook itp.), zgodnie z konfiguracją danego realm’u.</li>
<li style="font-weight: 400;" aria-level="1">Użytkownik wybiera dostawcę tożsamości, po czym jest przekierowywany na stronę logowania wybranego dostawcy, gdzie może podać swoje dane uwierzytelniające. Konfiguracja dostawcy tożsamości, w tym właściwości połączenia, została wcześniej ustawiona przez administratora za pomocą konsoli administracyjnej.</li>
<li style="font-weight: 400;" aria-level="1">Po pomyślnym uwierzytelnieniu użytkownik zostaje przekierowany z powrotem do Keycloak z odpowiedzią uwierzytelniającą, co ostatecznie prowadzi do uzyskania tokenu dostępu. Keycloak weryfikuje tożsamość i tworzy nowego użytkownika lub pomija ten krok, jeśli użytkownik już istnieje</li>
<li style="font-weight: 400;" aria-level="1">Gdy Keycloak pomyślnie uwierzytelni użytkownika, wydaje swój własny token umożliwiający dostęp do chronionego zasobu i przekierowuje użytkownika z powrotem do aplikacji klienckiej.</li>
</ol>
<p>&nbsp;</p>
<h3><b>Kluczowe zalety</b></h3>
<p><img loading="lazy" decoding="async" class=" wp-image-6106 alignleft" src="https://inero-software.com/wp-content/uploads/2024/09/7A-177x300.png" alt="" width="302" height="512" srcset="https://inero-software.com/wp-content/uploads/2024/09/7A-177x300.png 177w, https://inero-software.com/wp-content/uploads/2024/09/7A-608x1030.png 608w, https://inero-software.com/wp-content/uploads/2024/09/7A.png 637w" sizes="(max-width: 302px) 100vw, 302px" /></p>
<ul>
<li aria-level="1">Użytkownicy mogą zarejestrować się i uzyskać dostęp do Twojej aplikacji w zaledwie kilku kliknięciach. Aplikacje mogą korzystać z danych profilowych zamiast zmuszać użytkowników do ręcznego wprowadzania tych informacji w formularzach, co może przyspieszyć i uprościć proces rejestracji.</li>
<li aria-level="1">Logowanie społecznościowe zmniejsza ryzyko korzystania ze słabych haseł i oferuje zaawansowane funkcje bezpieczeństwa, takie jak uwierzytelnianie wieloskładnikowe (MFA). W wielu aplikacjach użytkownicy często nie aktualizują swoich profili, jednak zazwyczaj dbają o to, aby ich dane były aktualne w sieciach społecznościowych. Dlatego po wdrożeniu logowania społecznościowego możemy założyć, że dane użytkowników, które zbieramy, są wiarygodne, ponieważ pochodzą bezpośrednio z ich regularnie aktualizowanych profili.</li>
<li aria-level="1">Dostawcy sieci społecznościowych często oferują dodatkowe dane użytkownika, takie jak lokalizacja, zainteresowania i inne informacje wykraczające poza podstawowe dane profilowe. Dzięki temu możemy skuteczniej dostarczać użytkownikom spersonalizowane treści, co pozwala na bardziej ukierunkowane interakcje i rekomendacje treści.</li>
<li aria-level="1">Dostawca sieci społecznościowej jest również odpowiedzialny za weryfikację adresu e-mail użytkownika. Jeśli dostawca udostępnia te informacje, otrzymujemy prawidłowy adres e-mail, a nie potencjalnie fałszywe, które użytkownicy mogą podać podczas rejestracji w aplikacjach internetowych. Ponadto dostawca zarządza procesem odzyskiwania hasła, co zmniejsza potrzebę zajmowania się tym aspektem przez Twoją aplikację, upraszczając zarządzanie użytkownikami.Dane zazwyczaj pokazują poprawę w konwersji, a w niektórych przypadkach bardzo znaczący wzrost. <a href="http://auth0.com/blog/how-to-use-social-login-to-drive-your-apps-growth/">W artykule przygotowanym przez zespół marketingowy Auth0 stwierdzono, że logowanie społecznościowe może zwiększyć wskaźnik rejestracji nawet o 50%.</a></li>
</ul>
<p><strong>Nasze doświadczenie w rozwijaniu<a href="https://inero-software.com/pl/docs-quality/"> DocsQuality</a> pozwala nam wierzyć w zasadność tych założeń. Po wdrożeniu logowania za pomocą mediów społecznościowych zaobserwowaliśmy kilkukrotny wzrost liczby nowych użytkowników.</strong></p>
<p>&nbsp;</p>
<h3><b>Potencjalne wady </b></h3>
<p>Rozważając metody logowania społecznościowego w Keycloak, warto przemyśleć ich potencjalne wady, które przyczyniły się do zauważalnego spadku ich popularności w ostatnim czasie. Oto kilka kluczowych obaw:</p>
<ul>
<li>Chociaż dość rzadkie, istnieje ryzyko, że logowanie społecznościowe może stać się jednym punktem awarii. Jeśli dane logowania do mediów społecznościowych użytkownika zostaną skompromitowane, hakerzy mogą potencjalnie uzyskać dostęp do Twojej platformy oraz powiązanych kont.</li>
<li>Użytkownicy często martwią się o to, jak platformy mediów społecznościowych zarządzają ich danymi. To zaniepokojenie może sprawić, że będą niechętni do udzielania dodatkowym aplikacjom dostępu do swoich informacji, co może prowadzić do mniejszego wykorzystania funkcji logowania społecznościowego.</li>
<li>Protokoły logowania społecznościowego, takie jak OpenID Connect, są otwarte i interoperacyjne, ale ich wdrożenie może być wyzwaniem. Nawet doświadczeni programiści mogą uznać integrację tych standardów za czasochłonną i złożoną.</li>
</ul>
<p>Aby zaradzić tym obawom, ważne jest promowanie dobrych praktyk bezpieczeństwa w mediach społecznościowych wśród użytkowników. Zachęcanie do stosowania silnych, unikalnych haseł oraz dwuskładnikowego uwierzytelniania dla kont w mediach społecznościowych. Może to pomóc w zminimalizowaniu ryzyka i zwiększyć bezpieczeństwo metod logowania. Na szczęście, ostatni aspekt jest w dużej mierze rozwiązany przez Keycloak, który upraszcza wdrażanie tych protokołów. Dlatego w naszym przykładzie skupimy się na wykorzystaniu Keycloak do uproszczenia procesu logowania społecznościowego.</p>
<p>&nbsp;</p>
<h3><b>Tu zaczynamy </b></h3>
<p>W tym przykładzie użyjemy aplikacji, którą przygotowaliśmy w poprzednim wpisie na blogu, w którym dostosowaliśmy motywy. Początkowy widok wygląda następująco:</p>
<p><img loading="lazy" decoding="async" class="wp-image-6094 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/09/5-1-300x219.png" alt="" width="653" height="477" srcset="https://inero-software.com/wp-content/uploads/2024/09/5-1-300x219.png 300w, https://inero-software.com/wp-content/uploads/2024/09/5-1-1030x752.png 1030w, https://inero-software.com/wp-content/uploads/2024/09/5-1-768x561.png 768w, https://inero-software.com/wp-content/uploads/2024/09/5-1-411x300.png 411w, https://inero-software.com/wp-content/uploads/2024/09/5-1.png 1479w" sizes="(max-width: 653px) 100vw, 653px" /></p>
<p>Teraz możesz zalogować się do jednej z konsol dostawców tożsamości, takich jak GitHub w tym przypadku.</p>
<p>Przejdź do  <span style="font-weight: 400;"> </span><b>Settings -&gt; Developer settings -&gt; OAuth Apps</b><span style="font-weight: 400;">. Kliknij </span><b>New OAuth App</b> i wypełnij niezbędne informacje:</p>
<p>&#8211; Nazwa aplikacji (Application Name)<br />
&#8211; URL strony głównej (Homepage URL)<br />
&#8211; URL przekierowania autoryzacji (Authorization callback URL)</p>
<p>Ostatni adres powinien mieć format:<b>&lt;your-keycloak-domain&gt;/auth/realms/&lt;your-realm&gt;/broker/github/endpoint</b><span style="font-weight: 400;">.</span>. Do celów testowych spróbujemy skonfigurować środowisko lokalne, używając portów 4200 i 8080. Po wypełnieniu formularza kliknij <strong>Register Application</strong>. GitHub wygeneruje Client ID oraz <strong>Client Secret</strong>.</p>
<p><img loading="lazy" decoding="async" class=" wp-image-6093 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/09/4-300x169.png" alt="" width="744" height="419" srcset="https://inero-software.com/wp-content/uploads/2024/09/4-300x169.png 300w, https://inero-software.com/wp-content/uploads/2024/09/4-1030x579.png 1030w, https://inero-software.com/wp-content/uploads/2024/09/4-768x432.png 768w, https://inero-software.com/wp-content/uploads/2024/09/4-1536x864.png 1536w, https://inero-software.com/wp-content/uploads/2024/09/4-533x300.png 533w, https://inero-software.com/wp-content/uploads/2024/09/4.png 1920w" sizes="(max-width: 744px) 100vw, 744px" /></p>
<p>Teraz przejdź do konsoli administracyjnej Keycloak. W wybranym realmie, nawiguj do sekcji <strong>Identity Provider</strong>s z menu po lewej stronie. Z rozwijanego menu <strong>Add provider</strong> wybierz <strong>GitHub</strong>.</p>
<p><img loading="lazy" decoding="async" class=" wp-image-6092 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/09/3-300x248.png" alt="" width="709" height="586" srcset="https://inero-software.com/wp-content/uploads/2024/09/3-300x248.png 300w, https://inero-software.com/wp-content/uploads/2024/09/3-1030x852.png 1030w, https://inero-software.com/wp-content/uploads/2024/09/3-768x636.png 768w, https://inero-software.com/wp-content/uploads/2024/09/3-363x300.png 363w, https://inero-software.com/wp-content/uploads/2024/09/3.png 1305w" sizes="(max-width: 709px) 100vw, 709px" /></p>
<p>Wklej <strong>Client ID</strong> oraz <strong>Client Secret</strong>, które otrzymałeś od GitHub. Jeśli to konieczne, wybierz dodatkowe opcje, takie jak przechowywanie tokenów wydanych przez dostawcę (na przykład w celu dalszych zapytań do zasobów akceptujących ten token), automatyczna weryfikacja adresów e-mail lub inicjowanie określonego przepływu uwierzytelnienia po pomyślnym logowaniu. Po włączeniu dostawcy logowania społecznościowego w konsoli, strona logowania powinna wyglądać tak:</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-6095 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/09/6-300x282.png" alt="" width="586" height="551" srcset="https://inero-software.com/wp-content/uploads/2024/09/6-300x282.png 300w, https://inero-software.com/wp-content/uploads/2024/09/6-1030x970.png 1030w, https://inero-software.com/wp-content/uploads/2024/09/6-768x723.png 768w, https://inero-software.com/wp-content/uploads/2024/09/6-319x300.png 319w, https://inero-software.com/wp-content/uploads/2024/09/6.png 1147w" sizes="(max-width: 586px) 100vw, 586px" /></p>
<p>Po kliknięciu przycisku <strong>GitHub</strong> powinniśmy zobaczyć standardowe żądanie autoryzacji OAuth. Dzięki temu dostawcy logowania społecznościowego, tacy jak GitHub, mogą oznaczyć tę aplikację jako zweryfikowaną i automatycznie zezwalać na dalsze próby logowania w przyszłości.</p>
<p><img loading="lazy" decoding="async" class="wp-image-6091 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/09/2-300x250.png" alt="" width="691" height="576" srcset="https://inero-software.com/wp-content/uploads/2024/09/2-300x250.png 300w, https://inero-software.com/wp-content/uploads/2024/09/2-1030x858.png 1030w, https://inero-software.com/wp-content/uploads/2024/09/2-768x640.png 768w, https://inero-software.com/wp-content/uploads/2024/09/2-360x300.png 360w, https://inero-software.com/wp-content/uploads/2024/09/2-480x400.png 480w, https://inero-software.com/wp-content/uploads/2024/09/2.png 1297w" sizes="(max-width: 691px) 100vw, 691px" /></p>
<p>Po zatwierdzeniu autoryzacji powinniśmy zostać przekierowani z powrotem do aplikacji.</p>
<p><img loading="lazy" decoding="async" class="wp-image-6090 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/09/1-300x220.png" alt="" width="633" height="464" srcset="https://inero-software.com/wp-content/uploads/2024/09/1-300x220.png 300w, https://inero-software.com/wp-content/uploads/2024/09/1-1030x755.png 1030w, https://inero-software.com/wp-content/uploads/2024/09/1-768x563.png 768w, https://inero-software.com/wp-content/uploads/2024/09/1-409x300.png 409w, https://inero-software.com/wp-content/uploads/2024/09/1.png 1473w" sizes="(max-width: 633px) 100vw, 633px" /></p>
<h3>Podsumowując</h3>
<p>Przeszliśmy przez cały proces rejestracji dostawcy tożsamości w Keycloak, i jak widać, jest to dość proste. Jest to również świetny punkt wyjścia do dalszej nauki funkcji protokołu OAuth, obsługi niestandardowych dostawców tożsamości oraz wdrażania rozwiązań Single Sign-On (SSO), które być może omówimy w kolejnych wpisach.</p>
<p>Takie podejście nie tylko upraszcza proces rejestracji i zwiększa bezpieczeństwo, ale także zapewnia spójny i łatwy do zarządzania sposób łączenia się z różnymi platformami. Chociaż każdy dostawca może mieć specyficzne niuanse konfiguracyjne, cały proces konfiguracji pozostaje prosty i w dużej mierze podobny na różnych stronach internetowych. Dzięki zmniejszeniu barier wejścia dla użytkowników oraz efektywnemu, nowoczesnemu zarządzaniu uwierzytelnieniem, Keycloak umożliwia płynniejsze i bezpieczniejsze doświadczenie użytkownika.</p>
<p><a href="https://inero-software.com/pl/kontakt/"><img loading="lazy" decoding="async" data-attachment-id="6116" data-permalink="https://inero-software.com/pl/przewodnik-integracji-keycloak-logowanie-przez-platformy-spolecznosciowe/banery-11092024pl/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/09/banery-11092024PL.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 11092024PL" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/09/banery-11092024PL-300x25.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/09/banery-11092024PL-1030x86.png" tabindex="0" role="button" class="alignnone wp-image-6116 size-full" src="https://inero-software.com/wp-content/uploads/2024/09/banery-11092024PL.png" alt="" width="1200" height="100" srcset="https://inero-software.com/wp-content/uploads/2024/09/banery-11092024PL.png 1200w, https://inero-software.com/wp-content/uploads/2024/09/banery-11092024PL-300x25.png 300w, https://inero-software.com/wp-content/uploads/2024/09/banery-11092024PL-1030x86.png 1030w, https://inero-software.com/wp-content/uploads/2024/09/banery-11092024PL-768x64.png 768w" sizes="(max-width: 1200px) 100vw, 1200px" /></a></p>
<p></p></div><div class="col-sm-1"></div></div>
<p>Artykuł <a href="https://inero-software.com/pl/przewodnik-integracji-keycloak-logowanie-przez-platformy-spolecznosciowe/">Przewodnik integracji Keycloak: Logowanie przez platformy społecznościowe</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6115</post-id>	</item>
		<item>
		<title>Jak tworzyć i stosować własne motywy w Keycloak?</title>
		<link>https://inero-software.com/pl/jak-tworzyc-i-stosowac-wlasne-motywy-w-keycloak/</link>
		
		<dc:creator><![CDATA[Marceli Formela]]></dc:creator>
		<pubDate>Mon, 02 Sep 2024 12:59:16 +0000</pubDate>
				<category><![CDATA[Blog_pl]]></category>
		<category><![CDATA[Firma]]></category>
		<category><![CDATA[keycloak]]></category>
		<category><![CDATA[motyw]]></category>
		<category><![CDATA[ustawienia]]></category>
		<category><![CDATA[wygląd]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=6079</guid>

					<description><![CDATA[<p>&#160;</p>
<p>Artykuł <a href="https://inero-software.com/pl/jak-tworzyc-i-stosowac-wlasne-motywy-w-keycloak/">Jak tworzyć i stosować własne motywy w Keycloak?</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>&nbsp;</p>
<div class="row"><div class="col-sm-1"></div><div class="col-sm-10">
<h4>W naszym ostatnim poście (<a href="https://inero-software.com/pl/integracja-keycloak-i-lightweight-directory-access-protocol/">Integracja Keycloak i Lightweight Directory Access Protocol</a>) omówiliśmy to, jak łatwo importować użytkowników do naszego serwera Keycloak z innego systemu za pomocą protokołu LDAP. Tym razem przyjrzymy się bliżej wizualnemu aspektowi tego rozwiązania, dostosowując arkusz stylów naszej aplikacji.</h4>
<h3></h3>
<h3>Wbudowane motywy</h3>
<p>Keycloak oferuje wiele możliwości dostosowywania interfejsu użytkownika i wyglądu za pomocą tzw. „motywów”. Ich dostosowywanie  pozwala nam dopasować wygląd i &#8222;user experience&#8221; aplikacji do określonych potrzeb, wzmacniając przy tym wizualną tożsamość marki.</p>
<p>Keycloak zawiera kilka wbudowanych motywów dołączonych do swojej dystrybucji. Dostępne motywy obejmują motyw bazowy, który dostarcza szablony HTML i zestawy komunikatów, z których korzystają wszystkie inne motywy, w tym również te niestandardowe. Motyw keycloak zawiera obrazy i arkusze stylów do ulepszania CSS stron i jest używany domyślnie, jeśli nie dostarczono niestandardowego motywu. Dodatkowo, motyw keycloak.v2 to motyw oparty na React, zaprojektowany dla nowego Admin Console, podczas gdy starsza wersja konsoli zostanie wycofana. Modyfikowanie istniejących motywów nie jest zalecane; zamiast tego preferowane jest utworzenie nowego motywu, który rozszerza jeden z istniejących.</p>
<p>Dla pełnej personalizacji, idealnym rozwiązaniem jest skopiowanie zawartości z folderu <em>base</em>, ale w przypadku częściowej modyfikacji bardziej praktyczne jest rozpoczęcie od zawartości z katalogu <em>keycloak</em>. Jak już wspomnieliśmy, do nowego niestandardowego folderu powinny zostać dodane tylko te części motywu, które wymagają nadpisania.</p>
<p>&nbsp;</p>
<h3>Szablony FreeMarker</h3>
<p><em>Motywy FTL</em> w Keycloak odnoszą się do szablonów napisanych w języku <em>Freemarker Template Language</em>, które definiują wygląd i wrażenia z różnych stron i wiadomości e-mail w Keycloak. Te motywy pozwalają na dostosowanie wszystkiego, od stron logowania, przez komunikaty o błędach, po interfejsy zarządzania kontem.</p>
<p>Motywy w Keycloak są zazwyczaj zorganizowane w cztery główne kategorie:</p>
<p style="padding-left: 40px;">&#8211; <strong>Login</strong>: Dostosowuje wygląd stron logowania, rejestracji i resetowania hasła.<br />
&#8211; <strong>Account</strong>: Modyfikuje interfejs zarządzania kontem użytkownika.<br />
&#8211; <strong>Email</strong>: Dostosowuje treść i wygląd wiadomości e-mail wysyłanych przez Keycloak (np. e-maile weryfikacyjne, e-maile resetowania hasła).<br />
&#8211; <strong>Admin</strong>: Pozwala na dostosowanie konsoli administracyjnej Keycloak.</p>
<p><strong>Przyjrzyjmy się kilku istotnym szablonom:</strong></p>
<p style="padding-left: 40px;">&#8211; <strong>login.ftl</strong> &#8211; najczęściej dostosowywany szablon w Keycloak. Odpowiada za renderowanie strony logowania, na której użytkownicy wprowadzają swoje dane uwierzytelniające (nazwa użytkownika/adres e-mail i hasło), aby uzyskać dostęp do Twojej aplikacji.<br />
&#8211; <strong>register.ftl</strong> &#8211; używany na stronie rejestracji, gdzie nowi użytkownicy mogą utworzyć konto.<br />
&#8211; <strong>login-reset-password.ftl</strong> &#8211; używany, gdy użytkownik inicjuje proces resetowania hasła.<br />
&#8211; <strong>login-update-password.ftl</strong> &#8211; używany, gdy użytkownik musi zaktualizować swoje hasło, albo po udanym resetowaniu hasła, albo ze względu na wymóg polityki (np. okresowe zmiany hasła).</p>
<h3></h3>
<h3>Właściwości motywu</h3>
<p>Oprócz szablonów HTML, zestawów komunikatów, obrazów i arkuszy stylów, motyw Keycloak zawiera jeszcze kilka innych elementów, takich jak właściwości motywu. Każdy typ motywu posiada własny plik konfiguracyjny. Na przykład, rozważmy plik <strong>theme.properties</strong> z motywu logowania:</p>
<pre><i><span style="font-weight: 400;">parent=keycloak</span></i>
<i><span style="font-weight: 400;">import=common/keycloak</span></i>

<i><span style="font-weight: 400;">styles=css/login.css css/tile.css</span></i>
<i><span style="font-weight: 400;">stylesCommon=web_modules/@fortawesome/fontawesome-free/css/icons/all.css 
web_modules/@patternfly/react-core/dist/styles/base.css 
web_modules/@patternfly/react-core/dist/styles/app.css 
node_modules/patternfly/dist/css/patternfly.min.css 
node_modules/patternfly/dist/css/patternfly-additions.min.css lib/pficon/pficon.css</span></i></pre>
<p>Ten plik pokazuje, że motyw dziedziczy po motywie bazowym, aby korzystać z jego szablonów HTML i zestawów komunikatów. Importuje również motyw <em>common</em>, aby włączyć dodatkowe style. Ponadto, motyw określa własny arkusz stylów, <strong>css/login.css</strong>.</p>
<p>&nbsp;</p>
<h3><strong>Wiadomości i i18n</strong></h3>
<p>Keycloak wspiera internacjonalizację w motywach, pozwalając na tworzenie plików właściwości specyficznych dla danego języka, które przechowują tłumaczenia tekstów używanych w szablonach. Te pliki, nazwane<strong> messages_&lt;locale&gt;.properties</strong>, zawierają pary klucz-wartość, gdzie klucz reprezentuje element tekstowy, a wartość to jego tłumaczenie na docelowy język. W naszych szablonach FTL odwołujemy się do tych kluczy za pomocą dyrektywy <strong>${msg()}</strong>, co pozwala naszej aplikacji automatycznie wyświetlać odpowiednie tłumaczenie.</p>
<p>Powinno to odnosić się do języka aktualnie wybranego przez użytkownika. Keycloak określa język na podstawie ustawień przeglądarki, pod warunkiem że język ten jest skonfigurowany w systemie.</p>
<p>Na przykład na stronie logowania można dostarczyć tłumaczenie nagłówka „<em>Zaloguj się na swoje konto</em>,” który domyślnie może nie być przetłumaczony na języki takie jak niderlandzki czy hiszpański. Aby to zrobić, można edytować pole <strong>loginAccountTitle</strong> w pliku <em>messages</em>, dodając odpowiednie tłumaczenie dla każdego języka. Dzięki temu, gdy użytkownicy wybiorą swój język, zobaczą przetłumaczoną wersję w interfejsie logowania.</p>
<pre><i><span style="font-weight: 400;">messages.nl</span></i>
<i><span style="font-weight: 400;">loginAccountTitle=Inloggen</span></i>

<i><span style="font-weight: 400;">messages.es</span></i>
<i><span style="font-weight: 400;">loginAccountTitle=Iniciar sesi\u00F3n</span></i>

<i><span style="font-weight: 400;">messages.en</span></i>
<i><span style="font-weight: 400;">loginAccountTitle=Sign In</span></i></pre>
<p>Ostatnim krokiem jest skonfigurowanie ustawień internacjonalizacji dla Twojej domeny zgodnie z dostarczonym zrzutem ekranu. To zapewni, że dodane tłumaczenia, takie jak dla pola l<strong>oginAccountTitle</strong>, będą prawidłowo stosowane w zależności od wybranego przez użytkownika języka.</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-6061 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/08/1-300x169.png" alt="" width="604" height="340" srcset="https://inero-software.com/wp-content/uploads/2024/08/1-300x169.png 300w, https://inero-software.com/wp-content/uploads/2024/08/1-1030x579.png 1030w, https://inero-software.com/wp-content/uploads/2024/08/1-768x432.png 768w, https://inero-software.com/wp-content/uploads/2024/08/1-1536x864.png 1536w, https://inero-software.com/wp-content/uploads/2024/08/1-533x300.png 533w, https://inero-software.com/wp-content/uploads/2024/08/1.png 1920w" sizes="(max-width: 604px) 100vw, 604px" /></p>
<p>Oryginalna wersja angielska oraz ostateczny wynik dla wersji hiszpańskiej i niderlandzkiej są pokazane poniżej.</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-6068 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/08/8-300x165.png" alt="" width="478" height="263" srcset="https://inero-software.com/wp-content/uploads/2024/08/8-300x165.png 300w, https://inero-software.com/wp-content/uploads/2024/08/8-1030x565.png 1030w, https://inero-software.com/wp-content/uploads/2024/08/8-768x421.png 768w, https://inero-software.com/wp-content/uploads/2024/08/8-547x300.png 547w, https://inero-software.com/wp-content/uploads/2024/08/8.png 1037w" sizes="(max-width: 478px) 100vw, 478px" /></p>
<p><img loading="lazy" decoding="async" class=" wp-image-6069 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/08/9-300x159.png" alt="" width="525" height="278" srcset="https://inero-software.com/wp-content/uploads/2024/08/9-300x159.png 300w, https://inero-software.com/wp-content/uploads/2024/08/9-1030x546.png 1030w, https://inero-software.com/wp-content/uploads/2024/08/9-768x407.png 768w, https://inero-software.com/wp-content/uploads/2024/08/9-566x300.png 566w, https://inero-software.com/wp-content/uploads/2024/08/9.png 1053w" sizes="(max-width: 525px) 100vw, 525px" /></p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-6070 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/09/5-300x285.png" alt="" width="524" height="497" srcset="https://inero-software.com/wp-content/uploads/2024/09/5-300x285.png 300w, https://inero-software.com/wp-content/uploads/2024/09/5-768x730.png 768w, https://inero-software.com/wp-content/uploads/2024/09/5-316x300.png 316w, https://inero-software.com/wp-content/uploads/2024/09/5.png 997w" sizes="(max-width: 524px) 100vw, 524px" /></p>
<h3><strong>Dostosowywanie naszego motywu</strong></h3>
<p>Przed rozpoczęciem dostosowywania motywu upewnij się, że masz działającą instancję Keycloak. Będziesz potrzebować dostępu do plików serwera Keycloak oraz uprawnień administracyjnych, aby zastosować motyw. Jeśli uruchamiasz Keycloak w kontenerze Docker, możesz użyć montowania woluminu, aby uzyskać dostęp do plików motywu na swoim lokalnym komputerze.</p>
<p>Utwórz strukturę katalogów dla swojego niestandardowego motywu, postępując zgodnie z poniższym przykładem. Domyślne pliki motywu znajdują się w dystrybucji serwera Keycloak w katalogu <strong>themes/keycloak/login</strong>. Aby rozpocząć, skopiuj te domyślne pliki motywu z dystrybucji Keycloak do swojego niestandardowego katalogu motywu.</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-6066 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/08/6-268x300.png" alt="" width="375" height="420" srcset="https://inero-software.com/wp-content/uploads/2024/08/6-268x300.png 268w, https://inero-software.com/wp-content/uploads/2024/08/6-921x1030.png 921w, https://inero-software.com/wp-content/uploads/2024/08/6-768x859.png 768w, https://inero-software.com/wp-content/uploads/2024/08/6.png 966w" sizes="(max-width: 375px) 100vw, 375px" /></p>
<p>Zaczniemy od podstawowej strony logowania, jak pokazano poniżej:</p>
<p><img loading="lazy" decoding="async" class="wp-image-6063 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/08/3-300x169.png" alt="" width="737" height="415" srcset="https://inero-software.com/wp-content/uploads/2024/08/3-300x169.png 300w, https://inero-software.com/wp-content/uploads/2024/08/3-1030x579.png 1030w, https://inero-software.com/wp-content/uploads/2024/08/3-768x432.png 768w, https://inero-software.com/wp-content/uploads/2024/08/3-1536x864.png 1536w, https://inero-software.com/wp-content/uploads/2024/08/3-533x300.png 533w, https://inero-software.com/wp-content/uploads/2024/08/3.png 1920w" sizes="(max-width: 737px) 100vw, 737px" /></p>
<p>&nbsp;</p>
<p>Zlokalizuj i edytuj plik CSS, który kontroluje stylizację strony logowania. Zazwyczaj nosi on nazwę <strong>login.css</strong> i znajduje się w katalogu <strong>resources/css</strong> w Twoim niestandardowym motywie. Teraz możemy zmienić właściwość <strong>background</strong> i dodać własny plik <strong>.png</strong>.</p>
<pre><i><span style="font-weight: 400;">.login-pf-page::before {</span></i>
<i><span style="font-weight: 400;">content: "";</span></i>
<i><span style="font-weight: 400;">position: absolute;</span></i>
<i><span style="font-weight: 400;">top: 0;</span></i>
<i><span style="font-weight: 400;">left: 0;</span></i>
<i><span style="font-weight: 400;">width: 100%;</span></i>
<i><span style="font-weight: 400;">height: 100%;  </span></i>
<i><span style="font-weight: 400;">opacity: 1;</span></i>
<b><i>background: rgba(255, 255, 255, 0.4) url("../img/fb-background.png") no-repeat;</i></b>
<i><span style="font-weight: 400;">background-size: cover;</span></i>
<i><span style="font-weight: 400;">    </span></i> <i><span style="font-weight: 400;">z-index: -1;</span></i>
<i><span style="font-weight: 400;">}</span></i></pre>
<p>Oprócz zmiany tła, możemy również zmodyfikować kolor górnej krawędzi ekranu logowania oraz kolor przycisku logowania. Następnie możemy dodać niestandardowe logo. Można to zrobić, modyfikując następujące klasy:</p>
<pre><i><span style="font-weight: 400;">pf-m-primary {</span></i>
<i><span style="font-weight: 400;">color: black !important;</span></i>
<b><i>background-color: #B646AE !important;</i></b>
<i><span style="font-weight: 400;">}
</span></i>
<i><span style="font-weight: 400;">.card-pf {</span></i>
<i><span style="font-weight: 400;">margin: 0 auto;</span></i>
<i><span style="font-weight: 400;">box-shadow: var(--pf-global--BoxShadow--lg);</span></i>
<i><span style="font-weight: 400;">padding: 0 20px;</span></i>
<i><span style="font-weight: 400;">max-width: 500px;</span></i>
<i><span style="font-weight: 400;">border-top: 4px solid;</span></i>
<b><i>border-color: #B646AE;</i></b>
<i><span style="font-weight: 400;">background-color: #fff;</span></i>
<i><span style="font-weight: 400;">}</span></i>

<i><span style="font-weight: 400;">#kc-header-wrapper::before {</span></i>
<i><span style="font-weight: 400;">content: "";</span></i>
<i><span style="font-weight: 400;">position: relative;</span></i>
<i><span style="font-weight: 400;">margin: auto;</span></i>
<i><span style="font-weight: 400;">display: block;</span></i>
<i><span style="font-weight: 400;">width: 200px;</span></i>
<b><i>background: url("../img/fb-logo.png") no-repeat;</i></b>
<i><span style="font-weight: 400;">background-size: auto;</span></i>
<i><span style="font-weight: 400;">}</span></i></pre>
<p>Ostatnim krokiem będzie aktywacja niestandardowego motywu w konsoli administratora dla konkretnej domeny.</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-6062 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/08/2-300x149.png" alt="" width="587" height="292" srcset="https://inero-software.com/wp-content/uploads/2024/08/2-300x149.png 300w, https://inero-software.com/wp-content/uploads/2024/08/2-1030x512.png 1030w, https://inero-software.com/wp-content/uploads/2024/08/2-768x382.png 768w, https://inero-software.com/wp-content/uploads/2024/08/2-1536x764.png 1536w, https://inero-software.com/wp-content/uploads/2024/08/2-603x300.png 603w, https://inero-software.com/wp-content/uploads/2024/08/2.png 1920w" sizes="(max-width: 587px) 100vw, 587px" /></p>
<p>Po wprowadzeniu powyższych zmian, ostateczny efekt powinien wyglądać następująco:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-6067 size-full" src="https://inero-software.com/wp-content/uploads/2024/08/7.png" alt="" width="1920" height="1080" srcset="https://inero-software.com/wp-content/uploads/2024/08/7.png 1920w, https://inero-software.com/wp-content/uploads/2024/08/7-300x169.png 300w, https://inero-software.com/wp-content/uploads/2024/08/7-1030x579.png 1030w, https://inero-software.com/wp-content/uploads/2024/08/7-768x432.png 768w, https://inero-software.com/wp-content/uploads/2024/08/7-1536x864.png 1536w, https://inero-software.com/wp-content/uploads/2024/08/7-533x300.png 533w" sizes="(max-width: 1920px) 100vw, 1920px" /></p>
<p>Ostateczny rezultat może się jednak różnić w zależności od użycia różnych plików graficznych i definicji kolorów. Dostosowując te elementy, możesz łatwo osiągnąć unikalny wygląd, który będzie zgodny z Twoją marką i preferencjami w zakresie designu. Przy użyciu różnych zasobów może to wyglądać tak:</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-6064 size-full" src="https://inero-software.com/wp-content/uploads/2024/08/4.png" alt="" width="1920" height="1080" srcset="https://inero-software.com/wp-content/uploads/2024/08/4.png 1920w, https://inero-software.com/wp-content/uploads/2024/08/4-300x169.png 300w, https://inero-software.com/wp-content/uploads/2024/08/4-1030x579.png 1030w, https://inero-software.com/wp-content/uploads/2024/08/4-768x432.png 768w, https://inero-software.com/wp-content/uploads/2024/08/4-1536x864.png 1536w, https://inero-software.com/wp-content/uploads/2024/08/4-533x300.png 533w" sizes="(max-width: 1920px) 100vw, 1920px" /></p>
<p>Jak widać, dostosowywanie motywu Keycloak jest dość proste.</p>
<p>Do tej pory omówiliśmy, jak dostosować motywy Keycloak poprzez modyfikację elementów wizualnych. Przedstawiliśmy podstawy wbudowanych motywów Keycloak, które obejmują opcje dostosowywania strony logowania. W większości przypadków proces ten polega na skopiowaniu domyślnych plików motywu, modyfikacji CSS w celu wprowadzenia zmian w stylizacji, takich jak obrazy tła i kolory przycisków, oraz edycji szablonów FreeMarker w celu dostosowania układu. Dodatkowo, omówiliśmy, jak używać pliku <strong>theme.properties</strong> do konfiguracji niestandardowego motywu. Teraz mamy kilka podstawowych narzędzi, aby zmodyfikować wygląd Keycloak i lepiej dostosować go do potrzeb marki oraz użytkowników.</p>
<p>&nbsp;</p>
<h3>Podsumowanie</h3>
<p>Możesz w pełni dostosować stronę logowania, aby upewnić się, że nie przypomina ona domyślnego motywu Keycloak. To nie tylko poprawia doświadczenie użytkownika, ale także pomaga użytkownikom łatwiej odróżnić autentyczną stronę logowania od potencjalnych prób <em>phishingu</em>.</p>
<p>Keycloak umożliwia również dostosowanie treści i układu wiadomości e-mail (np. szablonów resetowania hasła). Tworząc unikalne, markowe treści, możesz pomóc użytkownikom rozpoznawać autentyczne prośby o resetowanie hasła, zmniejszając ryzyko stania się ofiarą ataków phishingowych, które naśladują takie wiadomości.</p>
<p>Poza wizualną personalizacją, motywy wspierają internacjonalizację, co pozwala na zapewnienie użytkownikom spójnych wrażeń w ich rodzimym języku. Może to obejmować tłumaczenie wszystkich tekstów na stronach logowania oraz w wiadomościach e-mail na odpowiedni język, co zwiększa użyteczność dla globalnych użytkowników.</p>
<p>Ogólnie rzecz biorąc, dostosowywanie motywów oferuje szerokie możliwości poprawy doświadczenia użytkownika i bezpieczeństwa Twojego systemu IAM.</p>
<h3>Czy potrzebujesz pomocy we wdrożeniu, aktualizacji lub szkolenia z Keycloak? Skontaktuj się ze mną.</h3>
<p><span style="font-size: 8.0pt; font-family: 'Calibri',sans-serif; color: black;">             <img loading="lazy" decoding="async" class="size-medium wp-image-5903 alignleft" src="https://inero-software.com/wp-content/uploads/2024/06/Andrzej-Chybicki-PhD-Eng.-1-300x300.png" alt="" width="300" height="300" 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" /></span></p>
<p><strong>Andrzej Chybicki </strong></p>
<p>CEO, Inero Software Sp. z o. o.<br />
@ andy@inero-software.com<br />
Tel: +48 695 875 588</p>
<p><a href="https://www.linkedin.com/in/andrzej-chybicki/"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-5897" src="https://inero-software.com/wp-content/uploads/2024/06/logo-linkedin.png" alt="" width="100" height="100" srcset="https://inero-software.com/wp-content/uploads/2024/06/logo-linkedin.png 100w, https://inero-software.com/wp-content/uploads/2024/06/logo-linkedin-80x80.png 80w, https://inero-software.com/wp-content/uploads/2024/06/logo-linkedin-75x75.png 75w, https://inero-software.com/wp-content/uploads/2024/06/logo-linkedin-50x50.png 50w" sizes="(max-width: 100px) 100vw, 100px" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p></p></div><div class="col-sm-1"></div></div>
<p>Artykuł <a href="https://inero-software.com/pl/jak-tworzyc-i-stosowac-wlasne-motywy-w-keycloak/">Jak tworzyć i stosować własne motywy w Keycloak?</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6079</post-id>	</item>
		<item>
		<title>Integracja Keycloak i Lightweight Directory Access Protocol</title>
		<link>https://inero-software.com/pl/integracja-keycloak-i-lightweight-directory-access-protocol/</link>
		
		<dc:creator><![CDATA[Marceli Formela]]></dc:creator>
		<pubDate>Fri, 26 Jul 2024 11:33:09 +0000</pubDate>
				<category><![CDATA[Blog_pl]]></category>
		<category><![CDATA[Firma]]></category>
		<category><![CDATA[keycloak]]></category>
		<category><![CDATA[relam]]></category>
		<guid isPermaLink="false">https://inero-software.com/?p=6038</guid>

					<description><![CDATA[<p>Artykuł <a href="https://inero-software.com/pl/integracja-keycloak-i-lightweight-directory-access-protocol/">Integracja Keycloak i Lightweight Directory Access Protocol</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="row"><div class="col-sm-1"></div><div class="col-sm-10">
<h4></h4>
<div class="flex-shrink-0 flex flex-col relative items-end">
<div>
<div class="pt-0">
<div class="gizmo-bot-avatar flex h-8 w-8 items-center justify-center overflow-hidden rounded-full">
<div class="relative p-1 rounded-sm flex items-center justify-center bg-token-main-surface-primary text-token-text-primary h-8 w-8"></div>
</div>
</div>
</div>
</div>
<div class="group/conversation-turn relative flex w-full min-w-0 flex-col agent-turn">
<div class="flex-col gap-1 md:gap-3">
<div class="flex flex-grow flex-col max-w-full">
<div class="min-h-&#091;20px&#093; text-message flex w-full flex-col items-end gap-2 whitespace-pre-wrap break-words &#091;.text-message+&amp;&#093;:mt-5 overflow-x-auto" dir="auto" data-message-author-role="assistant" data-message-id="479e6f0f-0844-41ad-860f-6ef57b28543c">
<div class="flex w-full flex-col gap-1 empty:hidden first:pt-&#091;3px&#093;">
<div class="markdown prose w-full break-words dark:prose-invert light">
<h4>Z poprzednich wpisów wiemy, że Keycloak daje nam przestrzeń do zarządzania tożsamościami użytkowników, zabezpieczania aplikacji i integracji z różnymi dostawcami. Dlatego jedną z jego kluczowych funkcji jest zdolność do integracji z katalogami Lightweight Directory Access Protocol (LDAP). Ten artykuł stanowi krótki przewodnik po eksporcie kont do federowanych realm&#8217;ów poprzez migrację użytkowników z ich poświadczeniami oraz importowanie grup za pomocą niestandardowych mapowań.</h4>
</div>
</div>
</div>
</div>
</div>
</div>
<p>&nbsp;</p>
<h3>Zrozumienie usług katalogowych</h3>
<p>Usługa katalogowa jest zbudowana w celu zarządzania i przechowywania danych w formacie par &#8222;klucz-wartość&#8221;. Ta struktura jest zoptymalizowana pod kątem operacji odczytu, co sprawia, że jest szczególnie dobrze dostosowana do informacji, które są często dostępne, ale rzadko aktualizowane. Dane w takim katalogu są często opisowe, służąc do szczegółowego przedstawienia różnych atrybutów jednostek.</p>
<p>Na przykład, wyobraź sobie używanie usługi katalogowej do zarządzania książką adresową. Każdy wpis w tej książce adresowej reprezentuje indywidualną osobę, a pary klucz-wartość przechowują jej dane kontaktowe, miejsce zatrudnienia i inne istotne informacje. Taka metoda organizacji danych jest szczególnie korzystna przy obsłudze informacji jakościowych i opisowych, które muszą być łatwo dostępne.</p>
<p>LDAP działa przy użyciu hierarchicznej struktury katalogowej, co umożliwia efektywne przechowywanie i dostęp do danych. Ten protokół jest powszechnie używany do śledzenia szczegółów organizacyjnych, w tym informacji o użytkownikach, zasobach i różnych jednostkach. Jego model wspiera elastyczne podejście do definiowania i zarządzania tymi jednostkami i ich atrybutami, zapewniając, że usługa katalogowa pozostaje dostosowana do różnych potrzeb organizacyjnych i skalowalna wraz z rosnącą ilością danych.</p>
<h3><b>Kluczowe funkcje LDAP</b></h3>
<ul>
<li style="list-style-type: none;">
<ul>
<li style="font-weight: 400;" aria-level="1"><strong>Standaryzowany protokół:</strong> LDAP jest szeroko rozpoznawanym protokołem, wspieranym przez liczne usługi katalogowe, w tym Microsoft Active Directory, OpenLDAP i Apache Directory Server.</li>
<li style="font-weight: 400;" aria-level="1"><strong>Struktura hierarchiczna</strong>: Katalogi LDAP są strukturyzowane hierarchicznie, podobnie jak drzewo, co ułatwia efektywną organizację i wyszukiwanie informacji.</li>
<li style="font-weight: 400;" aria-level="1"><strong>Skalowalność</strong>: LDAP jest zoptymalizowany do zarządzania dużą ilością operacji odczytu i wyszukiwania, co czyni go idealnym dla środowisk korporacyjnych na dużą skalę z rozległymi bazami użytkowników.</li>
</ul>
</li>
</ul>
<h3><b>Architektura LDAP </b></h3>
<p>Zrozumienie architektury LDAP jest kluczowe dla maksymalnego wykorzystania jego możliwości. Główne komponenty obejmują:</p>
<p>&nbsp;</p>
<h4>Drzewo informacji katalogowej (DIT)</h4>
<p>Hierarchiczna struktura katalogu składa się z wpisów, z których każdy reprezentuje obiekt, taki jak użytkownik, grupa czy urządzenie, i jest jednoznacznie identyfikowany przez nazwę wyróżniającą (<em>Distinguished Name, DN</em>). DIT jest zorganizowany hierarchicznie, z korzeniem drzewa na szczycie. Poniżej korzenia znajdują się różne poziomy węzłów, z których każdy reprezentuje różne typy jednostek, takie jak organizacje, departamenty i indywidualni użytkownicy. Taka  struktura pozwala na efektywne i logiczne zarządzanie oraz dostęp do danych katalogowych.</p>
<h4>Atrybuty / Wpisy</h4>
<p>Atrybuty są grupowane w jednostki zwane klasami obiektów (<em>objectClasses</em>), które są zbiorami powiązanych atrybutów przydatnych do opisywania określonych jednostek. Tworząc wpis, można wykorzystać atrybuty zdefiniowane przez klasę obiektów, przypisując pożądaną klasę obiektów do wpisu. W rzeczywistości atrybut objectClass jest jedynym atrybutem, który można ustawić bez konieczności specyfikowania dodatkowych klas obiektów.</p>
<p>Na przykład, tworząc wpis reprezentujący osobę, włączenie klasy obiektów—oraz wszelkich pochodnych klas obiektów—umożliwia korzystanie ze wszystkich atrybutów związanych z tą konkretną klasą obiektów. W takim wpisie można ustawić atrybuty takie jak cn (<em>common name)</em> dla nazwy zwyczajowej, <em>description</em> dla krótkiego opisu wpisu oraz <em>sn</em> dla nazwiska.</p>
<h4><b>Schemat </b></h4>
<p>Atrybuty i klasy obiektów są grupowane razem w tzw, schemat. Mechanizm ten dba o spójność i integralność w drzewie katalogowym, którego używamy. W przeciwieństwie do relacyjnych baz danych, te schematy to po prostu zbiory powiązanych obiektów i atrybutów. Pojedyncze drzewo informacji katalogowej (DIT) może wykorzystywać wiele schematów do tworzenia potrzebnych wpisów i atrybutów.</p>
<p>Schematy zazwyczaj zawierają dodatkowe specyfikacje atrybutów i mogą wymagać atrybutów określonych w innych schematach. Na przykład, klasa obiektów <em>person</em> wymaga włączenia atrybutu nazwiska (<em>sn</em>) dla wszelkich powiązanych wpisów. W przypadkach, gdy te atrybuty są nieobecne na serwerze LDAP, schemat zawierający te definicje może zostać zintegrowany ze strukturą drzewa serwera.</p>
<p>&nbsp;</p>
<h3>Odmiany protokołu</h3>
<p>LDAP to w istocie protokół, który definiuje interfejs komunikacyjny do pracy z usługami katalogowymi, często określanymi jako LDAP lub ldap. Istnieje kilka odmian formatu protokołu LDAP, które warto zauważyć:</p>
<ul>
<li style="list-style-type: none;">
<ul>
<li style="font-weight: 400;" aria-level="1">ldaps://: Ta odmiana oznacza LDAP zabezpieczony za pomocą SSL/TLS. Chociaż standardowy ruch LDAP jest nieszyfrowany, większość implementacji LDAP obsługuje szyfrowanie. Jednakże użycie SSL/TLS do szyfrowania LDAP jest przestarzałe, a zalecanym sposobem zabezpieczenia połączeń LDAP jest STARTTLS.</li>
<li style="font-weight: 400;" aria-level="1">ldap://: Jest to standardowy protokół LDAP, który zapewnia strukturalny dostęp do usługi katalogowej.</li>
<li style="font-weight: 400;" aria-level="1">ldapi://: Ta odmiana oznacza LDAP przez IPC (<em>Inter-Process Communication</em>). Zazwyczaj używany do bezpiecznych lokalnych połączeń z systemem LDAP do celów administracyjnych, na przykład przy użyciu wewnętrznych gniazd.</li>
</ul>
</li>
</ul>
<p>Chociaż wszystkie trzy formaty korzystają z protokołu LDAP, dwa z nich rozszerzają możliwości tej komunikacji.</p>
<p>&nbsp;</p>
<div class="group/conversation-turn relative flex w-full min-w-0 flex-col agent-turn">
<div class="flex-col gap-1 md:gap-3">
<div class="flex flex-grow flex-col max-w-full">
<div class="min-h-&#091;20px&#093; text-message flex w-full flex-col items-end gap-2 whitespace-pre-wrap break-words &#091;.text-message+&amp;&#093;:mt-5 overflow-x-auto" dir="auto" data-message-author-role="assistant" data-message-id="46eca452-56fc-4b2d-bf59-273e564c9e47">
<div class="flex w-full flex-col gap-1 empty:hidden first:pt-&#091;3px&#093;">
<div class="markdown prose w-full break-words dark:prose-invert light">
<h3>Powrót do realm i konfiguracja LDAP</h3>
</div>
</div>
</div>
</div>
</div>
</div>
<p>Po zapoznaniu się z teorią działania LDAP, możemy wrócić do realm, o którego konfiguracji wspominaliśmy w poprzednim poście (<a href="https://inero-software.com/pl/zarzadzanie-tozsamosciami-dzieki-federacjom-uzytkownikow-w-keycloak/">znajdziesz go tu</a>), i przejść do zakładki <em>User Federation</em>, w której możemy wprowadzić niezbędne dane, aby połączyć się z serwerem LDAP dostarczonym przez przykładowego dostawcę.</p>
<p><img loading="lazy" decoding="async" class="wp-image-6023 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/07/4.jpg" alt="" width="714" height="402" srcset="https://inero-software.com/wp-content/uploads/2024/07/4.jpg 1920w, https://inero-software.com/wp-content/uploads/2024/07/4-300x169.jpg 300w, https://inero-software.com/wp-content/uploads/2024/07/4-1030x579.jpg 1030w, https://inero-software.com/wp-content/uploads/2024/07/4-768x432.jpg 768w, https://inero-software.com/wp-content/uploads/2024/07/4-1536x864.jpg 1536w, https://inero-software.com/wp-content/uploads/2024/07/4-533x300.jpg 533w" sizes="(max-width: 714px) 100vw, 714px" /></p>
<p>Niezbędne informacje, których potrzebujemy, obejmują adres URL połączenia, nazwę wyróżniającą administratora LDAP (<em>bind DN</em>) oraz nazwę wyróżniającą użytkowników (<em>users DN</em>), która jest nadrzędna dla wszystkich użytkowników w drzewie LDAP. Większość atrybutów, takich jak nazwa użytkownika LDAP, UUID LDAP lub klasy obiektów użytkowników, można pozostawić na domyślnych wartościach, ponieważ są one zgodne z wymaganiami naszego dostawcy serwera LDAP.</p>
<p><img loading="lazy" decoding="async" class="wp-image-6024 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/07/7.jpg" alt="" width="715" height="264" srcset="https://inero-software.com/wp-content/uploads/2024/07/7.jpg 1920w, https://inero-software.com/wp-content/uploads/2024/07/7-300x111.jpg 300w, https://inero-software.com/wp-content/uploads/2024/07/7-1030x381.jpg 1030w, https://inero-software.com/wp-content/uploads/2024/07/7-768x284.jpg 768w, https://inero-software.com/wp-content/uploads/2024/07/7-1536x568.jpg 1536w, https://inero-software.com/wp-content/uploads/2024/07/7-811x300.jpg 811w" sizes="(max-width: 715px) 100vw, 715px" /></p>
<p>Po zsynchronizowaniu użytkowników widzimy, że w zakładce <em>Users</em> pojawiły się dwa nowe wpisy. Synchronizacja z LDAP oferuje więcej możliwości niż tylko prosty import kont użytkowników. Sprawdźmy, jak działają mapery (<em>mappers</em>).</p>
<h4>Przykład 1: hardcoded-attribute-mapper</h4>
<p>Możemy oznaczyć importowanych użytkowników, przypisując im niestandardowy atrybut. Można to zrobić za pomocą<em> hardcoded-attribute-mapper</em>, który przypisuje nowy atrybut, <em>authenticationMethod</em>, każdemu nowemu użytkownikowi i nadaje mu wartość &#8222;<em>ldap</em>&#8222;.</p>
<p><img loading="lazy" decoding="async" class="wp-image-6025 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/07/6.jpg" alt="" width="597" height="336" srcset="https://inero-software.com/wp-content/uploads/2024/07/6.jpg 1920w, https://inero-software.com/wp-content/uploads/2024/07/6-300x169.jpg 300w, https://inero-software.com/wp-content/uploads/2024/07/6-1030x579.jpg 1030w, https://inero-software.com/wp-content/uploads/2024/07/6-768x432.jpg 768w, https://inero-software.com/wp-content/uploads/2024/07/6-1536x864.jpg 1536w, https://inero-software.com/wp-content/uploads/2024/07/6-533x300.jpg 533w" sizes="(max-width: 597px) 100vw, 597px" /></p>
<p>W oknie Użytkownicy (Users) -&gt; Szczegóły użytkownika (User Details) -&gt; zakładka Atrybuty (Attributes), możemy zobaczyć, że użytkownicy pochodzący z LDAP rzeczywiście mają ten atrybut. Może on na przykład zostać uwzględniony w tokenach dostępu.</p>
<p><img loading="lazy" decoding="async" class="wp-image-6026 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/07/3.jpg" alt="" width="608" height="342" srcset="https://inero-software.com/wp-content/uploads/2024/07/3.jpg 1920w, https://inero-software.com/wp-content/uploads/2024/07/3-300x169.jpg 300w, https://inero-software.com/wp-content/uploads/2024/07/3-1030x579.jpg 1030w, https://inero-software.com/wp-content/uploads/2024/07/3-768x432.jpg 768w, https://inero-software.com/wp-content/uploads/2024/07/3-1536x864.jpg 1536w, https://inero-software.com/wp-content/uploads/2024/07/3-533x300.jpg 533w" sizes="(max-width: 608px) 100vw, 608px" /></p>
<h4>Przykład 2: group-ldap-mapper</h4>
<p>Często w LDAP zdefiniowany jest system ról lub grup, do których należą importowani użytkownicy. Keycloak może również importować grupy i automatycznie przypisywać do nich wspomnianych użytkowników. Aby to zrobić, możemy skonfigurować kolejny <em>mapper</em>, tym razem typu g<em>roup-ldap-mapper,</em> jak pokazano na poniższym obrazku:</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-6027 size-full" src="https://inero-software.com/wp-content/uploads/2024/07/5.jpg" alt="" width="1920" height="1080" srcset="https://inero-software.com/wp-content/uploads/2024/07/5.jpg 1920w, https://inero-software.com/wp-content/uploads/2024/07/5-300x169.jpg 300w, https://inero-software.com/wp-content/uploads/2024/07/5-1030x579.jpg 1030w, https://inero-software.com/wp-content/uploads/2024/07/5-768x432.jpg 768w, https://inero-software.com/wp-content/uploads/2024/07/5-1536x864.jpg 1536w, https://inero-software.com/wp-content/uploads/2024/07/5-533x300.jpg 533w" sizes="(max-width: 1920px) 100vw, 1920px" /></p>
<p>W tym przypadku nazwa wyróżniająca dla grup będzie taka sama jak DN dla wszystkich użytkowników, czyli:</p>
<p style="padding-left: 80px;"><span style="font-weight: 400; color: #0000ff;">ou=Users,o=66a20b93d2f2fc6db2e89ff3,dc=jumpcloud,dc=com</span></p>
<p>Grupy przechowywane w LDAP są zdefiniowane przez klasę obiektów o nazwie <em>groupOfNames</em>, co oznacza, że atrybutem reprezentującym członkostwo po stronie LDAP będzie zazwyczaj<em> member</em>.</p>
<p><img loading="lazy" decoding="async" class="wp-image-6028 aligncenter" src="https://inero-software.com/wp-content/uploads/2024/07/image_15-300x41.jpg" alt="" width="622" height="85" srcset="https://inero-software.com/wp-content/uploads/2024/07/image_15-300x41.jpg 300w, https://inero-software.com/wp-content/uploads/2024/07/image_15.jpg 595w" sizes="(max-width: 622px) 100vw, 622px" /></p>
<p>Jak widzimy, trzy grupy zostały poprawnie zaimportowane, wraz z relacjami między grupą a jej użytkownikami. Dzięki temu administratorzy LDAP mogą łatwo uzyskać odpowiednie uprawnienia po naszej stronie realm. Następnie możemy powiązać określone role z daną grupą, aby jeszcze wygodniej zarządzać dostępem do zasobów.</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-6031 size-full" src="https://inero-software.com/wp-content/uploads/2024/07/2.jpg" alt="" width="1920" height="959" srcset="https://inero-software.com/wp-content/uploads/2024/07/2.jpg 1920w, https://inero-software.com/wp-content/uploads/2024/07/2-300x150.jpg 300w, https://inero-software.com/wp-content/uploads/2024/07/2-1030x514.jpg 1030w, https://inero-software.com/wp-content/uploads/2024/07/2-768x384.jpg 768w, https://inero-software.com/wp-content/uploads/2024/07/2-1536x767.jpg 1536w, https://inero-software.com/wp-content/uploads/2024/07/2-601x300.jpg 601w" sizes="(max-width: 1920px) 100vw, 1920px" /><img loading="lazy" decoding="async" class="alignnone wp-image-6030 size-full" src="https://inero-software.com/wp-content/uploads/2024/07/1.jpg" alt="" width="1920" height="881" srcset="https://inero-software.com/wp-content/uploads/2024/07/1.jpg 1920w, https://inero-software.com/wp-content/uploads/2024/07/1-300x138.jpg 300w, https://inero-software.com/wp-content/uploads/2024/07/1-1030x473.jpg 1030w, https://inero-software.com/wp-content/uploads/2024/07/1-768x352.jpg 768w, https://inero-software.com/wp-content/uploads/2024/07/1-1536x705.jpg 1536w, https://inero-software.com/wp-content/uploads/2024/07/1-654x300.jpg 654w" sizes="(max-width: 1920px) 100vw, 1920px" /></p>
<h3>Podsumowanie</h3>
<p>Integracja Keycloak z LDAP to potężne narzędzie do zarządzania tożsamościami i bezpieczeństwem w organizacji. Ta integracja pozwala na efektywną synchronizację użytkowników i grup z LDAP, umożliwiając centralne zarządzanie uprawnieniami i dostępem do zasobów. Kluczowe kroki obejmują skonfigurowanie połączenia LDAP, synchronizację danych oraz użycie mapperów do dostosowania importowanych informacji, takich jak atrybuty i grupy użytkowników. Ważne jest, aby zrozumieć architekturę i działanie LDAP, aby w pełni wykorzystać jego możliwości. Implementacja LDAP z Keycloak nie tylko usprawnia zarządzanie kontami, ale także zwiększa bezpieczeństwo i upraszcza integrację z istniejącymi systemami. Korzystając z mapperów, możemy dodatkowo dostosować sposób importowania i wykorzystywania informacji w naszym systemie, co prowadzi do lepszej organizacji i kontroli dostępu w organizacji.</p>
<p><a href="https://inero-software.com/pl/keycloak/"><img loading="lazy" decoding="async" data-attachment-id="5997" data-permalink="https://inero-software.com/pl/integracja-keycloak-zgodnosc-z-dyrektywa-nis-2/banery-16072024-inero/" data-orig-file="https://inero-software.com/wp-content/uploads/2024/07/banery-16072024-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 16072024 inero" data-image-description="" data-image-caption="" data-medium-file="https://inero-software.com/wp-content/uploads/2024/07/banery-16072024-inero-300x25.png" data-large-file="https://inero-software.com/wp-content/uploads/2024/07/banery-16072024-inero-1030x86.png" tabindex="0" role="button" class="alignnone wp-image-5997 size-full" src="https://inero-software.com/wp-content/uploads/2024/07/banery-16072024-inero.png" alt="" width="1200" height="100" srcset="https://inero-software.com/wp-content/uploads/2024/07/banery-16072024-inero.png 1200w, https://inero-software.com/wp-content/uploads/2024/07/banery-16072024-inero-300x25.png 300w, https://inero-software.com/wp-content/uploads/2024/07/banery-16072024-inero-1030x86.png 1030w, https://inero-software.com/wp-content/uploads/2024/07/banery-16072024-inero-768x64.png 768w" sizes="(max-width: 1200px) 100vw, 1200px" /></a></p>
<p></p></div><div class="col-sm-1"></div></div>
<p>Artykuł <a href="https://inero-software.com/pl/integracja-keycloak-i-lightweight-directory-access-protocol/">Integracja Keycloak i Lightweight Directory Access Protocol</a> pochodzi z serwisu <a href="https://inero-software.com/pl">Inero Software - Rozwiązania IT i Konsulting</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6038</post-id>	</item>
	</channel>
</rss>
