Skip to content

Commit 52c4f65

Browse files
authored
support email templates for magic link
1 parent e1d3389 commit 52c4f65

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

src/main/java/com/instipod/keycloakauthenticators/MagicLinkFormAuthenticator.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,18 @@
2323
import org.keycloak.authentication.authenticators.browser.AbstractUsernameFormAuthenticator;
2424
import org.keycloak.common.util.KeycloakUriBuilder;
2525
import org.keycloak.email.EmailException;
26-
import org.keycloak.email.EmailSenderProvider;
26+
import org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider;
2727
import org.keycloak.models.KeycloakSession;
2828
import org.keycloak.models.RealmModel;
2929
import org.keycloak.models.UserModel;
3030
import org.keycloak.models.utils.KeycloakModelUtils;
31+
import org.keycloak.theme.FreeMarkerUtil;
3132

3233
import javax.ws.rs.core.MultivaluedMap;
3334
import javax.ws.rs.core.Response;
3435
import 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

Comments
 (0)