Skip to content

Commit

Permalink
Add translations (#96)
Browse files Browse the repository at this point in the history
* just formatting

* add additional language translations
  • Loading branch information
pnzrr authored Nov 26, 2024
1 parent cac3a43 commit 5ca5aab
Show file tree
Hide file tree
Showing 11 changed files with 266 additions and 7 deletions.
15 changes: 8 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ This contains two pathways to get a Magic Link:

### Authenticator

An Authenticator that can run as a form in your login flow. This takes an email, and can optionally create a user if none exists. This implementation sends the email using a theme-resources template, which you can override. Installation can be achieved by duplicating the Browser flow, and replacing the normal Username/Password/OTP forms with the Magic Link execution type ([@tstec-polypoly](https://github.com/tstec-polypoly) provides a great step-by-step guide for setting it up https://github.com/p2-inc/keycloak-magic-link/issues/6#issuecomment-1230675741). Note that you aren't required to use a *Username form* with this, as it extends `UsernamePasswordForm` and renders the username form page for you:
An Authenticator that can run as a form in your login flow. This takes an email, and can optionally create a user if none exists. This implementation sends the email using a theme-resources template, which you can override. Installation can be achieved by duplicating the Browser flow, and replacing the normal Username/Password/OTP forms with the Magic Link execution type ([@tstec-polypoly](https://github.com/tstec-polypoly) provides a great step-by-step guide for setting it up https://github.com/p2-inc/keycloak-magic-link/issues/6#issuecomment-1230675741). Note that you aren't required to use a _Username form_ with this, as it extends `UsernamePasswordForm` and renders the username form page for you:

![Install Magic Link Authenticator in Browser Flow](docs/assets/magic-link-authenticator.png)

Expand All @@ -30,8 +30,7 @@ The authenticator can be configured to create a user with the given email addres

## Magic link continuation

This Magic link continuation authenticator is similar to the Magic Link authenticator in implementation, but has a different behaviour. Instead of creating a session on the device where the link is clicked, the flow continues the login on the initial login page. The login page is polling the authentication page each 5 seconds until the session is confirmed or the authentication flow expires. The default expiration for the Magic link continuation flow is 10 minutes.

This Magic link continuation authenticator is similar to the Magic Link authenticator in implementation, but has a different behavior. Instead of creating a session on the device where the link is clicked, the flow continues the login on the initial login page. The login page is polling the authentication page each 5 seconds until the session is confirmed or the authentication flow expires. The default expiration for the Magic link continuation flow is 10 minutes.

### Authenticator

Expand All @@ -45,7 +44,6 @@ When the period is exceeded the authentication flow will reset.

![Magic Link continuation expired](docs/assets/magic-link-continuation-expiration.png)


### Resource

A Resource you can call with `manage-users` role, which allows you to specify the email, clientId, redirectUri, tokenExpiry and optionally if the email is sent, or the link is just returned to the caller.
Expand All @@ -69,14 +67,17 @@ Parameters:
| `reusable` | N | true | If the token can be reused multiple times during its validity |

Sample request (replace your access token):

```
curl --request POST https://keycloak.host/auth/realms/test/magic-link \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer <access_token>" \
--data '{"email":"[email protected]","client_id":"account-console","redirect_uri":"https://keycloak.host/auth/realms/test/account/","expiration_seconds":3600,"force_create":true,"update_profile":true,"update_password":true,"send_email":false}'
```

Sample response:

```
{
"user_id": "386edecf-3e43-41fd-886c-c674eea41034",
Expand All @@ -87,12 +88,13 @@ Sample response:

## Email OTP

There is a simple authenticator to email a 6-digit OTP to the users email address. This implementation sends the email using a theme-resources template, which you can override. It is recommended to use this in an Authentication flow following the *Username form*. An example flow looks like this:
There is a simple authenticator to email a 6-digit OTP to the users email address. This implementation sends the email using a theme-resources template, which you can override. It is recommended to use this in an Authentication flow following the _Username form_. An example flow looks like this:
![Install Email OTP Authenticator in Browser Flow](docs/assets/email-otp-authenticator.png)

## Installation

1. Build the jar:

```
mvn clean install
```
Expand All @@ -104,6 +106,7 @@ mvn clean install
Releases are tagged and published to [Maven Central](https://repo1.maven.org/maven2/io/phasetwo/keycloak/keycloak-magic-link/) after each merge to `main`. Jars can be downloaded from there.

If you are depending on the library in your own Maven-built project, or using a bundling tool in Maven, you can add the dependency like this:

```xml
<dependency>
<groupId>io.phasetwo.keycloak</groupId>
Expand All @@ -112,7 +115,6 @@ If you are depending on the library in your own Maven-built project, or using a
</dependency>
```


## Implementation Notes

This is a rough outline of the implementation:
Expand All @@ -137,4 +139,3 @@ User contributed POC using Jupyter: https://github.com/tstec-polypoly/explore-ke
---

All documentation, source code and other files in this repository are Copyright 2024 Phase Two, Inc.

25 changes: 25 additions & 0 deletions src/main/resources/theme-resources/messages/messages_de.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# email
magicLinkSubject=Anmeldung bei {0}
magicLinkBody=Jemand hat einen Anmeldelink für {0} angefordert.\n\nKlicken Sie, um sich anzumelden.\n\n{1}\n\nWenn Sie diesen Link nicht angefordert haben, ignorieren Sie bitte diese E-Mail.
magicLinkBodyHtml=<p>Jemand hat einen Anmeldelink für {0} angefordert</p><p><a href="{1}">Klicken Sie, um sich anzumelden</a>.</p><p>Wenn Sie diesen Link nicht angefordert haben, ignorieren Sie bitte diese E-Mail.</p>
otpSubject=Ihr Zugangscode für {0}
otpBody=Jemand hat ein Einmal-Passwort angefordert, um sich bei {0} anzumelden.\n\nCode: {1}\n\nWenn Sie diesen Code nicht angefordert haben, ignorieren Sie bitte diese E-Mail.
otpBodyHtml=<p>Jemand hat ein Einmal-Passwort angefordert, um sich bei {0} anzumelden.</p><p><b>Code: {1}</b></p><p>Wenn Sie diesen Code nicht angefordert haben, ignorieren Sie bitte diese E-Mail.</p>
magicLinkContinuationSubject=Anmeldung bei {0}
magicLinkContinuationBody=Jemand hat einen Anmeldelink für {0} angefordert.\n\nKlicken Sie, um sich anzumelden.\n\n{1}\n\nWenn Sie diesen Link nicht angefordert haben, ignorieren Sie bitte diese E-Mail.
magicLinkContinuationBodyHtml=<p>Jemand hat einen Anmeldelink für {0} angefordert</p><p><a href="{1}">Klicken Sie, um sich anzumelden</a>.</p><p>Wenn Sie diesen Link nicht angefordert haben, ignorieren Sie bitte diese E-Mail.</p>

# login
magicLinkConfirmation=Überprüfen Sie Ihre E-Mails und klicken Sie auf den Link, um sich anzumelden!
doResend=Erneut senden
magicLinkContinuationConfirmation=Überprüfen Sie Ihre E-Mails und klicken Sie auf den Link, um sich anzumelden! Bitte schließen Sie diesen Tab nicht.
magicLinkSuccessfulLogin=Authentifizierungssitzung bestätigt. Bitte kehren Sie zum Anmelde-Tab zurück.
magicLinkFailLogin=Authentifizierungssitzung abgelaufen. Bitte schließen Sie diesen Tab und starten Sie den Anmeldevorgang neu.
loginPage=Anmeldeseite
multipleSessionsError=Mehrere Anmeldesitzungen im selben Browser geöffnet. Bitte schließen Sie diese und starten Sie die Anmeldung neu.

# admin text
ext-magic-form-display-name=Magischer Link
ext-magic-form-help-text=Melden Sie sich mit einem magischen Link an, der an Ihre E-Mail gesendet wird.
ext-email-otp-display-name=E-Mail OTP
ext-email-otp-help-text=Melden Sie sich mit einem Einmal-Passwort an, das an Ihre E-Mail gesendet wird.
25 changes: 25 additions & 0 deletions src/main/resources/theme-resources/messages/messages_es.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# email
magicLinkSubject=Iniciar sesión en {0}
magicLinkBody=Alguien solicitó un enlace de inicio de sesión para {0}.\n\nHaga clic para iniciar sesión.\n\n{1}\n\nSi no solicitó este enlace, ignore este correo electrónico.
magicLinkBodyHtml=<p>Alguien solicitó un enlace de inicio de sesión para {0}</p><p><a href="{1}">Haga clic para iniciar sesión</a>.</p><p>Si no solicitó este enlace, ignore este correo electrónico.</p>
otpSubject=Su código de acceso para {0}
otpBody=Alguien solicitó una contraseña de un solo uso para iniciar sesión en {0}.\n\nCódigo: {1}\n\nSi no solicitó este código, ignore este correo electrónico.
otpBodyHtml=<p>Alguien solicitó una contraseña de un solo uso para iniciar sesión en {0}.</p><p><b>Código: {1}</b></p><p>Si no solicitó este código, ignore este correo electrónico.</p>
magicLinkContinuationSubject=Iniciar sesión en {0}
magicLinkContinuationBody=Alguien solicitó un enlace de inicio de sesión para {0}.\n\nHaga clic para iniciar sesión.\n\n{1}\n\nSi no solicitó este enlace, ignore este correo electrónico.
magicLinkContinuationBodyHtml=<p>Alguien solicitó un enlace de inicio de sesión para {0}</p><p><a href="{1}">Haga clic para iniciar sesión</a>.</p><p>Si no solicitó este enlace, ignore este correo electrónico.</p>

# login
magicLinkConfirmation=¡Revise su correo electrónico y haga clic en el enlace para iniciar sesión!
doResend=Reenviar
magicLinkContinuationConfirmation=¡Revise su correo electrónico y haga clic en el enlace para iniciar sesión! Por favor, no cierre esta pestaña.
magicLinkSuccessfulLogin=Sesión de autenticación confirmada. Por favor, regrese a la pestaña de la página de inicio de sesión.
magicLinkFailLogin=La sesión de autenticación ha expirado. Por favor, cierre esta pestaña y reinicie el flujo de inicio de sesión.
loginPage=Página de inicio de sesión
multipleSessionsError=Múltiples sesiones de inicio de sesión abiertas en el mismo navegador. Por favor, ciérrelas y reinicie el inicio de sesión.

# admin text
ext-magic-form-display-name=Enlace mágico
ext-magic-form-help-text=Inicie sesión con un enlace mágico que se enviará a su correo electrónico.
ext-email-otp-display-name=OTP por correo electrónico
ext-email-otp-help-text=Inicie sesión con una contraseña de un solo uso que se enviará a su correo electrónico.
25 changes: 25 additions & 0 deletions src/main/resources/theme-resources/messages/messages_fr.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# email
magicLinkSubject=Connexion à {0}
magicLinkBody=Quelqu'un a demandé un lien de connexion pour {0}.\n\nCliquez pour vous connecter.\n\n{1}\n\nSi vous n'avez pas demandé ce lien, veuillez ignorer cet e-mail.
magicLinkBodyHtml=<p>Quelqu'un a demandé un lien de connexion pour {0}</p><p><a href="{1}">Cliquez pour vous connecter</a>.</p><p>Si vous n'avez pas demandé ce lien, veuillez ignorer cet e-mail.</p>
otpSubject=Votre code d'accès pour {0}
otpBody=Quelqu'un a demandé un mot de passe à usage unique pour se connecter à {0}.\n\nCode : {1}\n\nSi vous n'avez pas demandé ce code, veuillez ignorer cet e-mail.
otpBodyHtml=<p>Quelqu'un a demandé un mot de passe à usage unique pour se connecter à {0}.</p><p><b>Code : {1}</b></p><p>Si vous n'avez pas demandé ce code, veuillez ignorer cet e-mail.</p>
magicLinkContinuationSubject=Connexion à {0}
magicLinkContinuationBody=Quelqu'un a demandé un lien de connexion pour {0}.\n\nCliquez pour vous connecter.\n\n{1}\n\nSi vous n'avez pas demandé ce lien, veuillez ignorer cet e-mail.
magicLinkContinuationBodyHtml=<p>Quelqu'un a demandé un lien de connexion pour {0}</p><p><a href="{1}">Cliquez pour vous connecter</a>.</p><p>Si vous n'avez pas demandé ce lien, veuillez ignorer cet e-mail.</p>

# login
magicLinkConfirmation=Vérifiez votre e-mail et cliquez sur le lien pour vous connecter !
doResend=Renvoyer
magicLinkContinuationConfirmation=Vérifiez votre e-mail et cliquez sur le lien pour vous connecter ! Veuillez ne pas fermer cet onglet.
magicLinkSuccessfulLogin=Session d'authentification confirmée. Veuillez revenir à l'onglet de la page de connexion.
magicLinkFailLogin=La session d'authentification a expiré. Veuillez fermer cet onglet et redémarrer le processus de connexion.
loginPage=Page de connexion
multipleSessionsError=Plusieurs sessions de connexion ouvertes sur le même navigateur. Veuillez les fermer et redémarrer la connexion.

# admin text
ext-magic-form-display-name=Lien magique
ext-magic-form-help-text=Connectez-vous avec un lien magique qui sera envoyé à votre e-mail.
ext-email-otp-display-name=OTP par e-mail
ext-email-otp-help-text=Connectez-vous avec un mot de passe à usage unique qui sera envoyé à votre e-mail.
25 changes: 25 additions & 0 deletions src/main/resources/theme-resources/messages/messages_hu.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# email
magicLinkSubject=Bejelentkezés a(z) {0} oldalra
magicLinkBody=Valaki bejelentkezési linket kért a(z) {0} oldalra.\n\nKattintson a bejelentkezéshez.\n\n{1}\n\nHa nem Ön kérte ezt a linket, kérjük, hagyja figyelmen kívül ezt az e-mailt.
magicLinkBodyHtml=<p>Valaki bejelentkezési linket kért a(z) {0} oldalra</p><p><a href="{1}">Kattintson a bejelentkezéshez</a>.</p><p>Ha nem Ön kérte ezt a linket, kérjük, hagyja figyelmen kívül ezt az e-mailt.</p>
otpSubject=Az Ön hozzáférési kódja a(z) {0} oldalhoz
otpBody=Valaki egyszeri jelszót kért a(z) {0} oldalra való bejelentkezéshez.\n\nKód: {1}\n\nHa nem Ön kérte ezt a kódot, kérjük, hagyja figyelmen kívül ezt az e-mailt.
otpBodyHtml=<p>Valaki egyszeri jelszót kért a(z) {0} oldalra való bejelentkezéshez.</p><p><b>Kód: {1}</b></p><p>Ha nem Ön kérte ezt a kódot, kérjük, hagyja figyelmen kívül ezt az e-mailt.</p>
magicLinkContinuationSubject=Bejelentkezés a(z) {0} oldalra
magicLinkContinuationBody=Valaki bejelentkezési linket kért a(z) {0} oldalra.\n\nKattintson a bejelentkezéshez.\n\n{1}\n\nHa nem Ön kérte ezt a linket, kérjük, hagyja figyelmen kívül ezt az e-mailt.
magicLinkContinuationBodyHtml=<p>Valaki bejelentkezési linket kért a(z) {0} oldalra</p><p><a href="{1}">Kattintson a bejelentkezéshez</a>.</p><p>Ha nem Ön kérte ezt a linket, kérjük, hagyja figyelmen kívül ezt az e-mailt.</p>

# login
magicLinkConfirmation=Ellenőrizze az e-mailjét, és kattintson a linkre a bejelentkezéshez!
doResend=Újraküldés
magicLinkContinuationConfirmation=Ellenőrizze az e-mailjét, és kattintson a linkre a bejelentkezéshez! Kérjük, ne zárja be ezt a lapot.
magicLinkSuccessfulLogin=Azonosítási munkamenet megerősítve. Kérjük, térjen vissza a bejelentkezési oldalra.
magicLinkFailLogin=Azonosítási munkamenet lejárt. Kérjük, zárja be ezt a lapot, és indítsa újra a bejelentkezési folyamatot.
loginPage=Bejelentkezési oldal
multipleSessionsError=Több bejelentkezési munkamenet nyitva ugyanazon a böngészőn. Kérjük, zárja be, és indítsa újra a bejelentkezést.

# admin text
ext-magic-form-display-name=Varázslink
ext-magic-form-help-text=Jelentkezzen be egy varázslinkkel, amelyet elküldünk az e-mail címére.
ext-email-otp-display-name=E-mail OTP
ext-email-otp-help-text=Jelentkezzen be egy egyszeri jelszóval, amelyet elküldünk az e-mail címére.
25 changes: 25 additions & 0 deletions src/main/resources/theme-resources/messages/messages_it.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# email
magicLinkSubject=Accedi a {0}
magicLinkBody=Qualcuno ha richiesto un link di accesso a {0}.\n\nClicca per accedere.\n\n{1}\n\nSe non hai richiesto questo link, ignora questa email.
magicLinkBodyHtml=<p>Qualcuno ha richiesto un link di accesso a {0}</p><p><a href="{1}">Clicca per accedere</a>.</p><p>Se non hai richiesto questo link, ignora questa email.</p>
otpSubject=Il tuo codice di accesso per {0}
otpBody=Qualcuno ha richiesto una password monouso per accedere a {0}.\n\nCodice: {1}\n\nSe non hai richiesto questo codice, ignora questa email.
otpBodyHtml=<p>Qualcuno ha richiesto una password monouso per accedere a {0}.</p><p><b>Codice: {1}</b></p><p>Se non hai richiesto questo codice, ignora questa email.</p>
magicLinkContinuationSubject=Accedi a {0}
magicLinkContinuationBody=Qualcuno ha richiesto un link di accesso a {0}.\n\nClicca per accedere.\n\n{1}\n\nSe non hai richiesto questo link, ignora questa email.
magicLinkContinuationBodyHtml=<p>Qualcuno ha richiesto un link di accesso a {0}</p><p><a href="{1}">Clicca per accedere</a>.</p><p>Se non hai richiesto questo link, ignora questa email.</p>

# login
magicLinkConfirmation=Controlla la tua email e clicca sul link per accedere!
doResend=Invia di nuovo
magicLinkContinuationConfirmation=Controlla la tua email e clicca sul link per accedere! Per favore, non chiudere questa scheda.
magicLinkSuccessfulLogin=Sessione di autenticazione confermata. Per favore, torna alla scheda della pagina di accesso.
magicLinkFailLogin=Sessione di autenticazione scaduta. Per favore, chiudi questa scheda e riavvia il flusso di accesso.
loginPage=Pagina di accesso
multipleSessionsError=Più sessioni di accesso aperte sullo stesso browser. Per favore, chiudile e riavvia l'accesso.

# admin text
ext-magic-form-display-name=Link magico
ext-magic-form-help-text=Accedi con un link magico che verrà inviato alla tua email.
ext-email-otp-display-name=OTP email
ext-email-otp-help-text=Accedi con una password monouso che verrà inviata alla tua email.
25 changes: 25 additions & 0 deletions src/main/resources/theme-resources/messages/messages_ja.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# email
magicLinkSubject={0} にログイン
magicLinkBody=誰かが {0} へのログインリンクをリクエストしました。\n\nクリックしてログインしてください。\n\n{1}\n\nこのリンクをリクエストしていない場合は、このメールを無視してください。
magicLinkBodyHtml=<p>誰かが {0} へのログインリンクをリクエストしました</p><p><a href="{1}">クリックしてログインしてください</a>。</p><p>このリンクをリクエストしていない場合は、このメールを無視してください。</p>
otpSubject={0} のアクセスコード
otpBody=誰かが {0} へのログインのためにワンタイムパスワードをリクエストしました。\n\nコード:{1}\n\nこのコードをリクエストしていない場合は、このメールを無視してください。
otpBodyHtml=<p>誰かが {0} へのログインのためにワンタイムパスワードをリクエストしました。</p><p><b>コード:{1}</b></p><p>このコードをリクエストしていない場合は、このメールを無視してください。</p>
magicLinkContinuationSubject={0} にログイン
magicLinkContinuationBody=誰かが {0} へのログインリンクをリクエストしました。\n\nクリックしてログインしてください。\n\n{1}\n\nこのリンクをリクエストしていない場合は、このメールを無視してください。
magicLinkContinuationBodyHtml=<p>誰かが {0} へのログインリンクをリクエストしました</p><p><a href="{1}">クリックしてログインしてください</a>。</p><p>このリンクをリクエストしていない場合は、このメールを無視してください。</p>

# login
magicLinkConfirmation=メールを確認し、リンクをクリックしてログインしてください!
doResend=再送
magicLinkContinuationConfirmation=メールを確認し、リンクをクリックしてログインしてください!このタブを閉じないでください。
magicLinkSuccessfulLogin=認証セッションが確認されました。ログインページのタブに戻ってください。
magicLinkFailLogin=認証セッションが期限切れになりました。このタブを閉じて、ログインフローを再起動してください。
loginPage=ログインページ
multipleSessionsError=同じブラウザで複数のログインセッションが開かれています。それを閉じて、ログインを再起動してください。

# admin text
ext-magic-form-display-name=マジックリンク
ext-magic-form-help-text=メールに送信されるマジックリンクでサインインします。
ext-email-otp-display-name=メール OTP
ext-email-otp-help-text=メールに送信されるワンタイムパスワードでサインインします。
Loading

0 comments on commit 5ca5aab

Please sign in to comment.