[JAVA] Versuchen Sie, dem Keycloak-Authentifizierungsprozess eine SMS-Authentifizierung (mit Twilio) hinzuzufügen

Einführung

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? SMS-Authentifizierung?

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.

SMS認証イメージ.png

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.

Was ist Twilio?

20171206203748.png

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.

Vorbereitungen

Erstellen Sie ein Twilio-Konto

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.)

Holen Sie sich API-KEY für Twilio

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.

verify.png

  • 「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.)

verify2.png

  • 「4. Get verified」
  • Überprüfen Sie die cURL, um festzustellen, ob der von Ihnen erhaltene Bestätigungscode korrekt ist.

Damit sind die Vorbereitungen auf der Twilio-Seite abgeschlossen.

Anmeldebestätigung vor der Anpassung

Überprüfen Sie den Anmeldevorgang vor dem Anpassen. Sie können Ihre Anmeldung bestätigen, indem Sie auf den Bildschirm zur Kontoverwaltung zugreifen.

  • Bildschirm zur Kontoverwaltung anzeigen
  • http: // localhost: 8080 / auth / realms / Realmname / Konto

Login.png

  • Erfolgreiche Anmeldung am Kontoverwaltungsbildschirm

Login_OK.png

Ich habe bestätigt, dass ich mich nur durch Eingabe von Benutzername / Passwort anmelden kann.

Anpassung der Authentifizierungsfunktion

Passen Sie die Authentifizierungsfunktion an. Der Arbeitsauftrag lautet wie folgt.

  1. Bildschirm erstellen (Themen)
  2. Erstellen Sie ein SMS-Authentifizierungsmodul
  3. Reflektieren Sie das Anpassungsmodul in Keycloak
  4. Starten Sie Keycloak
  5. Einstellungen widerspiegeln (Verwaltungskonsole)

Bildschirm erstellen (Themen)

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.

  • Bildschirm zur Eingabe des Bestätigungscodes (sms-validation.ftl)

verifyinput.png

  • Authentifizierungscode-Fehlerbildschirm (sms-validation-error.ftl)

verifyerror.png

  • Nachrichtendatei (* .properties)
  • messages_ja.properties (japanische Nachrichten)
  • messages_en.properties

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

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.

  • Der dem SMS-Authentifizierungsmodul entsprechende SPI ist ** Authentifizierungs-SPI **
  • implementiert`` interface ist org.keycloak.authentication.Authenticator

Erstellen Sie zunächst die folgenden zwei Grundklassen.

  • Klasse des SMS-Authentifizierungsmoduls

    • SMSAuthenticator implements Authenticator
  • Factory-Klasse der SMS-Authentifizierungsmodulklasse

    • SMSAuthenticatorFactory implements AuthenticatorFactory, ConfigurableAuthenticatorFactory

SMSAuthenticatorFactory-Implementierung

  • getId () Methode
  • Gibt die Provider-ID zurück. (einzigartig)
	public static final String PROVIDER_ID = "sms-authenticator-with-twilio";

	public String getId() {
		return PROVIDER_ID;
	}
  • getDisplayType () Methode
  • Gibt den Anzeigenamen des Bildschirms zurück.
	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
  • Gibt den Anforderungstyp zur Unterstützung zurück. Dieses Mal nur erforderlich (ERFORDERLICH) und deaktiviert (DEAKTIVIERT) einstellen. Andere sind ALTERNATIV und OPTIONAL.
	private static final AuthenticationExecutionModel.Requirement[] REQUIREMENT_CHOICES = {
			AuthenticationExecutionModel.Requirement.REQUIRED,
			AuthenticationExecutionModel.Requirement.DISABLED
	};

	public Requirement[] getRequirementChoices() {
		return REQUIREMENT_CHOICES;
	}
  • Um die SMSAuthenticatorFactory-Klasse zu registrieren, platzieren Sie eine Definitionsdatei, die den Namen der Factory-Klasse beschreibt, wie unten unter META-INF gezeigt.

META-INF/services/org.keycloak.authentication.AuthenticatorFactory


jp.openstandia.keycloak.authenticator.SMSAuthenticatorFactory

Implementierung des SMS-Authentifikators

  • authenticate (AuthenticationFlowContext context) Methode
  • Authentifizierungsprozess, implementieren Sie den SMS-Authentifizierungscode-Übertragungsprozess mit dieser Methode
public 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) Methode
  • Der Prozess wurde implementiert, um den vom Bildschirm eingegebenen Authentifizierungscode mit dieser Methode zu überprüfen
public 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".

SMS-Übertragung / Bestätigungsverarbeitung

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 das Anpassungsmodul in Keycloak

Reflektieren Sie die erstellte Datei in Keycloak.

Platzierung von Themen

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.

Platzierung des Authentifizierungsmoduls (.jar)

Packen Sie das mit mvn package erstellte Authentifizierungsmodul und platzieren Sie die JAR-Datei in _KEYCLOAK_HOME_ / standalone / deployments /.

Starten Sie Keycloak

Starten Sie nach der Bereitstellung aller Anpassungsmodule Keycloak.

Einstellungen widerspiegeln (Verwaltungskonsole)

Reflexion von Themen

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.

themes.png

Änderung des Authentifizierungsflusses

Ändern Sie den Authentifizierungsablauf über die Administrationskonsole, um das SMS-Authentifizierungsmodul zum Authentifizierungsprozess hinzuzufügen.

"Management Console" - "Authentication" - Authentifizierungsablaufbildschirm "Browser"

console1.png

Kopieren Sie den Authentifizierungsablauf "Browser" (da der Standardauthentifizierungsablauf "Browser" nicht direkt geändert werden kann). Der Name des Authentifizierungsflusses ist beliebig.

console2.png

Kopierter Authentifizierungsablauf "Openstandia Browser"

console3.png

Klicken Sie in "Openstandia Browser Forms" auf "Aktionen" und dann auf "Ausführung hinzufügen".

console4.png

Wählen Sie das diesmal erstellte Modul aus. Der Anzeigename hier ist der in "getDisplayType" von "SMSAuthenticatorFactory" festgelegte Name.

console5.png

"Twilio SMS Authentication" hinzugefügt und die Ausführungsreihenfolge über "OTP Form" verschoben. "OTP Form" ist deaktiviert (DISABLED) (optional)

console6.png

Klicken Sie unter "Twilio SMS Authentication" auf "Aktion" und dann auf "Einstellungen". Hier werden die in getConfigProperties von SMSAuthenticatorFactory festgelegten Bildschirmelemente angezeigt.

console7.png

  • "API-KEY" legt den von Twilio erhaltenen API-KEY fest.
  • Wenn Sie einen Proxy benötigen, setzen Sie Proxy Enabled auf On und geben Sie die Proxy-Informationen ein.
  • "SMS-Code-Länge" ist die Anzahl der Ziffern des zu sendenden Bestätigungscodes.

Kehren Sie zum Authentifizierungsablauf zurück und klicken Sie auf die Registerkarte "Bindung". Ändern Sie den Browserfluss in den kopierten "Openstandia-Browser".

console8.png

Damit sind die Änderungen an der Verwaltungskonsole abgeschlossen.

Funktionsprüfung

Fügen Sie den Benutzerattributen Telefonnummern hinzu, um sich vorab anzumelden. Ordnen Sie den "Schlüssel" des Telefonnummernattributs dem Attributnamen im Authentifizierungsmodul zu.

user_telnum.png

Melden Sie sich beim Kontoverwaltungsbildschirm an (http: // localhost: 8080 / auth / realms / Realmname / Konto).

Login.png

Der Bildschirm zur Eingabe des Bestätigungscodes wird angezeigt.

verifyinput.png

Der Bestätigungscode wird per SMS an die eingegebene Telefonnummer gesendet.

認証コード.png

Gib den Bestätigungscode ein

verify1.png

Die Anmeldung ist abgeschlossen

verifyok.png

  • Das Folgende ist ein Fehlerbildschirm, wenn der falsche Code eingegeben wird. Die Fehlermeldung "Authentifizierungscode stimmt nicht überein" ist die von setError of Response (Challenge) festgelegte Meldung.

verifyerror.png

Dies ist das Ende der Funktionsprüfung.

Schließlich

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:

Referenzmaterial

mark.png

Recommended Posts

Versuchen Sie, dem Keycloak-Authentifizierungsprozess eine SMS-Authentifizierung (mit Twilio) hinzuzufügen
Versuchen Sie, mit Scala mithilfe der Standardbibliothek von Java Text zu einem Bild hinzuzufügen