-
Notifications
You must be signed in to change notification settings - Fork 52
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* just formatting * add additional language translations
- Loading branch information
Showing
11 changed files
with
266 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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) | ||
|
||
|
@@ -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 | ||
|
||
|
@@ -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. | ||
|
@@ -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", | ||
|
@@ -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 | ||
``` | ||
|
@@ -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> | ||
|
@@ -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: | ||
|
@@ -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
25
src/main/resources/theme-resources/messages/messages_de.properties
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
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
25
src/main/resources/theme-resources/messages/messages_es.properties
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
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
25
src/main/resources/theme-resources/messages/messages_fr.properties
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
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
25
src/main/resources/theme-resources/messages/messages_hu.properties
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
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
25
src/main/resources/theme-resources/messages/messages_it.properties
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
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
25
src/main/resources/theme-resources/messages/messages_ja.properties
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
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=メールに送信されるワンタイムパスワードでサインインします。 |
Oops, something went wrong.