Heute am 5. Tag ist die Anpassung von Keycloak. Eine Beschreibung von Keycloak finden Sie unter Was ist Keycloak. In diesem Artikel wird Keycloak im letztjährigen Keycloak by OpenStandia Adventskalender 2017 vorgestellt. Ich habe auch am letztjährigen Keycloak-Adventskalender teilgenommen und einen Artikel über [Keycloak-Anpassungspunkte] geschrieben (https://qiita.com/yoonis/items/298d580f7e93e56ddf6a). Dieses Mal übernehmen wir die Authentifizierungsfunktion (Authentication SPI) in diesem Anpassungspunkt und SMS für die Authentifizierungsverarbeitung. Passen wir es an, um eine Authentifizierungsfunktion (Identitätsprüfung) hinzuzufügen.
SMS (Short Message Service) ist ein Dienst, mit dem Sie Kurznachrichten per Telefonnummer senden und empfangen können. Bei der SMS-Authentifizierung wird eine Authentifizierung (Identitätsprüfung) mithilfe von SMS durchgeführt. Das folgende Bild wird in einem Bild ausgedrückt.
Indem Sie den Bestätigungscode getrennt von der ID / PWD-Anmeldung an die registrierte Telefonnummer von Herrn A senden und bestätigen, können Sie Ihre Identität zuverlässiger bestätigen und so die Wahrscheinlichkeit erhöhen, dass nicht autorisierte Anmeldungen von Dritten verhindert werden. Ich werde.
SMS-Sende- und Empfangsdienste werden von Twilio, nexmo, [Amazon SNS]( Es gibt mehrere wie https://aws.amazon.com/jp/sns/), aber ** Twilio ** </ font> wird für diesen SMS-Sende- / Empfangsdienst verwendet. Ich werde.
Twilio ist ein Cloud-Kommunikationsunternehmen mit Sitz in San Francisco, das Dienste zum Senden und Empfangen von Telefonanrufen und Textnachrichten mithilfe der WEB-Service-API bereitstellt. In Japan ist KDDI die Agentur und japanisches Dokument ist auch für die Öffentlichkeit zugänglich. Ich denke, es wird einfach sein, es bei der ersten Verwendung einzugeben.
Nebenbei wurde auch Twilios Adventskalender in diesem Jahr registriert. (Seit 2015 jedes Jahr registriert) Twilio bietet verschiedene Kommunikations-APIs außer dem Senden und Empfangen von SMS. Wenn Sie interessiert sind, lesen Sie diese bitte.
Um die SMS-Authentifizierung von Twilio verwenden zu können, benötigen Sie ein Twilio-Konto (um genau zu sein, benötigen Sie API-KEY zum Senden und Empfangen von SMS). Kostenloses Testkonto kann in Twilio bis zu einem bestimmten Betrag registriert und kostenlos sein Es ist möglich, in zu verwenden. Wenn ein bestimmter Betrag erreicht ist, wird das Konto automatisch gesperrt und eine Upgrade-Benachrichtigung an das bezahlte Konto gesendet.
Sie werden nicht belastet, es sei denn, Sie führen ein Upgrade auf ein kostenpflichtiges Konto durch (Stand Dezember 2018). Dies kann sich jedoch in Zukunft ändern. Überprüfen Sie daher bitte die Nutzungsbedingungen bei der Registrierung. Die Registrierung selbst ist einfach, daher denke ich, dass Sie normal vorgehen können. Die Überprüfung der Telefonnummer (SMS) erfolgt während der Registrierung. Bereiten Sie daher ein Telefon vor, das SMS empfangen kann. (SMS-Kommunikationsgebühren trägt der Empfänger.)
Wenn nach dem Erstellen eines Kontos der TOP-Bildschirm angezeigt wird, gehen Sie zu "Oberer Bildschirm" ⇒ "Überprüfung der Telefonnummer" ⇒ "Überprüfung der Telefonnummer Projekt-Dashboard" ⇒ "Überprüfen". Der folgende Bildschirm wird angezeigt. Fahren wir in der Reihenfolge der Zahlen fort.
「1. Let’s verify a phone number on your Twilio account」
Überprüfen Sie hier die Telefonnummer erneut.
「2. Create an application and get your API credentials」
Erstellen Sie eine Anwendung und eine API. Sobald Sie eine Anwendung erstellt haben, können Sie den SMS-Sende- / Empfangshistorie und den API-KEY überprüfen und aktualisieren.
「3. Send your first Verify code」
Verwenden Sie den oben erstellten Anwendungs-API-KEY, um den SMS-Bestätigungscode mit cURL zu senden. Der Inhalt der Anfrage wird wie unten gezeigt angezeigt, sodass Sie hier auch den API-KEY überprüfen können. (Sie können dies auch über den Einstellungsbildschirm überprüfen.)
Damit sind die Vorbereitungen auf der Twilio-Seite abgeschlossen.
Überprüfen Sie den Anmeldevorgang vor dem Anpassen. Sie können Ihre Anmeldung bestätigen, indem Sie auf den Bildschirm zur Kontoverwaltung zugreifen.
Ich habe bestätigt, dass ich mich nur durch Eingabe von Benutzername / Passwort anmelden kann.
Passen Sie die Authentifizierungsfunktion an. Der Arbeitsauftrag lautet wie folgt.
Ich habe ein neues Thema namens "openstandia" erstellt, um zwei Bildschirme (".ftl") und eine Nachrichtendatei (".properties") zu erstellen. Der Quellcode lautet hier. Um dies wiederzugeben, platzieren Sie den Ordner "openstandia" des Quellcodes unter "KEYCLOAK_HOME / theme /". Der Ordner wird angezeigt.
Wir haben zwei Nachrichtendateien vorbereitet, eine für Japanisch (jp) und eine für Englisch (en). Die entsprechende Sprache wird in "locales" von [theme.properties] festgelegt (https://github.com/sangyoon-lee/keycloak-sms-authenticator/blob/master/themes/openstandia/login/theme.properties). ..
_KEYCLOAK_HOME_/themes/Themenname/login/theme.properties
parent=keycloak
import=common/keycloak
locales=en,ja
Informationen zum Anpassen von Themen finden Sie unter "[Organisieren von Keycloak-Anpassungspunkten - Über Themen]" (https://qiita.com/yoonis/items/298d580f7e93e56ddf6a#themes%E3%81%AB%E3%81%A4). % E3% 81% 84% E3% 81% A6) ”, beziehen Sie sich bitte darauf.
Erstellen Sie ein SMS-Authentifizierungsmodul. Zum Zeitpunkt von "Getting API-KEY of Twilio" haben wir den Bestätigungscode ausgegeben und den Bestätigungscode mit cURL bestätigt. Dies wird jedoch im SMS-Überprüfungsmodul ausgeführt.
implementiert`` interface
ist org.keycloak.authentication.Authenticator
Erstellen Sie zunächst die folgenden zwei Grundklassen.
Klasse des SMS-Authentifizierungsmoduls
Factory-Klasse der SMS-Authentifizierungsmodulklasse
getId ()
Methode public static final String PROVIDER_ID = "sms-authenticator-with-twilio";
public String getId() {
return PROVIDER_ID;
}
getDisplayType ()
Methode public String getDisplayType() {
return "Twilio SMS Authentication";
}
isConfigurable ()
Methode
Gibt zurück, ob es sich um einen Authentifikator handelt, der auf dem Bildschirm (Administrationskonsole) festgelegt werden kann. Gibt "true" zurück, wenn Elemente auf dem Bildschirm eingegeben werden müssen. Dieses Mal wird API-KEY usw. eingegeben, also "true"
getConfigProperties ()
Methode
Definition des Eingabeelements für den Bildschirm (Administrationskonsole). Ich möchte API-KEY, Authentifizierungscode-Ziffern, Proxy-Einstellungen usw. über die Verwaltungskonsole eingeben, also legen Sie sie hier fest.
private static final List<ProviderConfigProperty> configProperties;
static {
configProperties = ProviderConfigurationBuilder
.create()
.property()
.name(SMSAuthContstants.CONFIG_SMS_API_KEY)
.label("API-KEY")
.type(ProviderConfigProperty.STRING_TYPE)
.helpText("")
.add()
......
.property()
.name(SMSAuthContstants.CONFIG_CODE_LENGTH)
.label("Code Length")
.type(ProviderConfigProperty.STRING_TYPE)
.helpText("")
.defaultValue(4)
.add()
.build();
}
......
public List<ProviderConfigProperty> getConfigProperties() {
return configProperties;
}
getRequirementChoices ()
Methode private static final AuthenticationExecutionModel.Requirement[] REQUIREMENT_CHOICES = {
AuthenticationExecutionModel.Requirement.REQUIRED,
AuthenticationExecutionModel.Requirement.DISABLED
};
public Requirement[] getRequirementChoices() {
return REQUIREMENT_CHOICES;
}
META-INF/services/org.keycloak.authentication.AuthenticatorFactory
jp.openstandia.keycloak.authenticator.SMSAuthenticatorFactory
authenticate (AuthenticationFlowContext context)
Methodepublic void authenticate(AuthenticationFlowContext context) {
......
if (sendVerify.sendSMS(phoneNumber)) { //SMS senden
Response challenge = context.form().createForm("sms-validation.ftl");
context.challenge(challenge);
} else {
//Gibt einen Fehlerbildschirm zurück, wenn SMS fehlschlägt
Response challenge = context.form().setError(new FormMessage("sendSMSCodeErrorMessage"))
.createForm("sms-validation-error.ftl");
context.challenge(challenge);
}
......
}
Hier ist zu beachten, wie das Ergebnis zurückgegeben wird. Stellen Sie den Bildschirm so ein, dass die Antwortinformationen (Herausforderung) (createForm) auf "Kontext" zurückgesetzt werden. Sie können auch eine Fehlermeldung (setError
) festlegen, wenn ein Fehler auftritt. Der Einstellungswert von setError`` new FormMessage (" sendSMSCodeErrorMessage ")
sendSMSCodeErrorMessage
ist der messages von Themes. / openstandia / login / messages) Dies ist der Nachrichtenschlüssel, der in der Datei messages_xx_properties
definiert ist.
action (AuthenticationFlowContext context)
Methodepublic void action(AuthenticationFlowContext context) {
MultivaluedMap<String, String> inputData = context.getHttpRequest().getDecodedFormParameters();
String enteredCode = inputData.getFirst("smsCode");
......
if (sendVerify.verifySMS(phoneNumber, enteredCode)) { //Bestätigung des Bestätigungscodes
logger.info("verify code check : OK");
//Wenn der Bestätigungscode in Ordnung ist
context.success();
} else {
//Gibt einen Fehlerbildschirm zurück, wenn die Authentifizierung fehlschlägt
Response challenge = context.form()
.setAttribute("username", context.getAuthenticationSession().getAuthenticatedUser().getUsername())
.setError(new FormMessage("invalidSMSCodeMessage")).createForm("sms-validation-error.ftl");
context.challenge(challenge);
}
......
}
Achten Sie auch hier darauf, wie Sie das Ergebnis zurückgeben. Wenn die Überprüfung des Bestätigungscodes mit "verifySMS" erfolgreich ist, ist dieses Überprüfungsergebnis mit "context.success ()" in Ordnung. Stellen Sie im Fehlerfall den Anzeigebildschirm und die Fehlermeldung in Antwort (Abfrage) ein und setzen Sie sie wie bei der Authentifizierungsmethode auf "Kontext".
Der im obigen "SMSAuthenticator" implementierte SMS-Übertragungs- / Code-Bestätigungsprozess wurde unter Verwendung der Twilio-API unter Verwendung von "HttpsURLConnection" implementiert. Die Verarbeitung der SMS-Übertragung (Twilio API-Aufruf) erfolgt hier. api / SMSSendVerify.java)
Das ist alles für die Modulerstellung. Hier wurden nur die wichtigen Methoden vorgestellt. Der Quellcode des Beispielmoduls wird auf GitHub veröffentlicht. Überprüfen Sie daher den Quellcode auf detaillierte Einstellungen. Der Quellcode ist hier
Reflektieren Sie die erstellte Datei in Keycloak.
Platzieren Sie die erstellte Themendatei (für jeden Openstandia-Ordner) in _KEYCLOAK_HOME_ / theme /
. Wenn es zum Zeitpunkt "Bildschirm erstellen (Themen)" bereits platziert wurde, überspringen Sie es.
Packen Sie das mit mvn package
erstellte Authentifizierungsmodul und platzieren Sie die JAR-Datei in _KEYCLOAK_HOME_ / standalone / deployments /
.
Starten Sie nach der Bereitstellung aller Anpassungsmodule Keycloak.
Reflektiert Themen. Dies erfolgt über die Registerkarte "Realm Settings" - "Themes". Da diesmal nur das Anmeldethema erstellt wird, ändern Sie das "Anmeldethema" in "openstandia". Andere Themen werden nicht geändert.
Ändern Sie den Authentifizierungsablauf über die Administrationskonsole, um das SMS-Authentifizierungsmodul zum Authentifizierungsprozess hinzuzufügen.
"Management Console" - "Authentication" - Authentifizierungsablaufbildschirm "Browser"
Kopieren Sie den Authentifizierungsablauf "Browser" (da der Standardauthentifizierungsablauf "Browser" nicht direkt geändert werden kann). Der Name des Authentifizierungsflusses ist beliebig.
Kopierter Authentifizierungsablauf "Openstandia Browser"
Klicken Sie in "Openstandia Browser Forms" auf "Aktionen" und dann auf "Ausführung hinzufügen".
Wählen Sie das diesmal erstellte Modul aus. Der Anzeigename hier ist der in "getDisplayType" von "SMSAuthenticatorFactory" festgelegte Name.
"Twilio SMS Authentication" hinzugefügt und die Ausführungsreihenfolge über "OTP Form" verschoben. "OTP Form" ist deaktiviert (DISABLED) (optional)
Klicken Sie unter "Twilio SMS Authentication" auf "Aktion" und dann auf "Einstellungen". Hier werden die in getConfigProperties
von SMSAuthenticatorFactory
festgelegten Bildschirmelemente angezeigt.
Kehren Sie zum Authentifizierungsablauf zurück und klicken Sie auf die Registerkarte "Bindung". Ändern Sie den Browserfluss in den kopierten "Openstandia-Browser".
Damit sind die Änderungen an der Verwaltungskonsole abgeschlossen.
Fügen Sie den Benutzerattributen Telefonnummern hinzu, um sich vorab anzumelden. Ordnen Sie den "Schlüssel" des Telefonnummernattributs dem Attributnamen im Authentifizierungsmodul zu.
Melden Sie sich beim Kontoverwaltungsbildschirm an (http: // localhost: 8080 / auth / realms / Realmname / Konto).
Der Bildschirm zur Eingabe des Bestätigungscodes wird angezeigt.
Der Bestätigungscode wird per SMS an die eingegebene Telefonnummer gesendet.
Gib den Bestätigungscode ein
Die Anmeldung ist abgeschlossen
Dies ist das Ende der Funktionsprüfung.
Ich habe das Authentifizierungs-SPI angepasst und dem Authentifizierungsprozess eine SMS-Authentifizierung hinzugefügt. Die Anpassung von Keycloak ist nicht auf SPI-Authentifizierung beschränkt, und die Anpassungsmethode für alle SPIs ist grundsätzlich dieselbe.
Einfach gesagt
Überprüfen Sie den SPI, der der anpassbaren Funktion entspricht. (Diesmal Authentifizierungs-SPI)
Überprüfen Sie die "Schnittstelle", die die anzupassende Funktion "implementieren" soll. (Diesmal Authenticator)
Implementieren Sie die von implementiert
die Ziel Schnittstelle
bereitgestellte Methode.
Nur das.
Bei der Implementierung der dritten Methode werden wir sie implementieren und gleichzeitig verstehen, welche Rolle jede Methode spielt. (Da dies die Hauptzeit ist, dauert es am längsten, aber ...)
Sobald Sie das Anpassen eines SPI erlebt haben, können Sie es problemlos implementieren, selbst wenn Sie von nun an ein anderes SPI anpassen. Bitte versuchen Sie, Keycloak anzupassen: +1: