2323import org .keycloak .authentication .authenticators .browser .AbstractUsernameFormAuthenticator ;
2424import org .keycloak .common .util .KeycloakUriBuilder ;
2525import org .keycloak .email .EmailException ;
26- import org .keycloak .email .EmailSenderProvider ;
26+ import org .keycloak .email .freemarker . FreeMarkerEmailTemplateProvider ;
2727import org .keycloak .models .KeycloakSession ;
2828import org .keycloak .models .RealmModel ;
2929import org .keycloak .models .UserModel ;
3030import org .keycloak .models .utils .KeycloakModelUtils ;
31+ import org .keycloak .theme .FreeMarkerUtil ;
3132
3233import javax .ws .rs .core .MultivaluedMap ;
3334import javax .ws .rs .core .Response ;
3435import java .util .ArrayList ;
36+ import java .util .HashMap ;
37+ import java .util .Map ;
3538
3639/**
3740 * @author <a href="mailto:[email protected] ">Stian Thorgersen</a> @@ -46,6 +49,11 @@ public void action(AuthenticationFlowContext context) {
4649 sendMagicLink (context , email );
4750 }
4851
52+ @ Override
53+ public boolean requiresUser () {
54+ return false ;
55+ }
56+
4957 public void sendMagicLink (AuthenticationFlowContext context , String email ) {
5058 UserModel user = context .getSession ().users ().getUserByEmail (email , context .getRealm ());
5159 if (user == null ) {
@@ -62,11 +70,18 @@ public void sendMagicLink(AuthenticationFlowContext context, String email) {
6270 context .getAuthenticationSession ().setAuthNote ("email-key" , key );
6371
6472 String link = KeycloakUriBuilder .fromUri (context .getRefreshExecutionUrl ()).queryParam ("key" , key ).build ().toString ();
65- String body = "<a href=\" " + link + "\" >Click to login</a>" ;
73+ Map <String , Object > attributes = new HashMap <String , Object >();
74+ attributes .put ("link" , link );
75+
6676 try {
67- context .getSession ().getProvider (EmailSenderProvider .class ).send (context .getRealm ().getSmtpConfig (), user , "Login link" , null , body );
77+ FreeMarkerEmailTemplateProvider emailTemplateProvider = new FreeMarkerEmailTemplateProvider (context .getSession (), new FreeMarkerUtil ());
78+ emailTemplateProvider .setRealm (context .getRealm ());
79+ emailTemplateProvider .setUser (context .getUser ());
80+ emailTemplateProvider .setAuthenticationSession (context .getAuthenticationSession ());
81+ emailTemplateProvider .send ("magicLinkSubject" , "magic-link.ftl" , attributes );
6882 } catch (EmailException e ) {
6983 e .printStackTrace ();
84+ context .failure (AuthenticationFlowError .INTERNAL_ERROR );
7085 }
7186
7287 context .setUser (user );
@@ -102,11 +117,6 @@ public void authenticate(AuthenticationFlowContext context) {
102117 }
103118 }
104119
105- @ Override
106- public boolean requiresUser () {
107- return false ;
108- }
109-
110120 @ Override
111121 public boolean configuredFor (KeycloakSession session , RealmModel realm , UserModel user ) {
112122 return true ;
0 commit comments