简体   繁体   中英

How to get the email-verification link inside my custom SPI in keycloak

I have my code below, this is inside my notification-spi project, which get triggered when a new user is created. I am able to receive the email. However i don't know how i can get the email-verification link when RequiredActions verify-email is selected by the admin who created the account in keycloak admin ui.

public void onEvent(AdminEvent adminEvent, boolean includeRepresentation) {


    EmailSenderProvider emailSender = session.getProvider(EmailSenderProvider.class);
    RealmModel realm = session.realms().getRealm(adminEvent.getRealmId());
    UserModel user = session.userCache().getUserById(adminEvent.getAuthDetails().getUserId(),
        realm);

    if (OperationType.CREATE.equals(adminEvent.getOperationType())) {
      LOGGER.info("OPERATION CREATE USER");
      LOGGER.info("Representation : " + adminEvent.getRepresentation());

      try {
        LOGGER.info("Sending email...");
        emailSender.send(realm.getSmtpConfig(), user, "Account Enrollment",
            "A new account has been created using your email.",
            "<h1>Account Enrollment</h1> <br/>"
                + "<p>A new account has been created using your email</p>");
        LOGGER.info("Email has been sent.");
      } catch (EmailException e) {
        LOGGER.info(e.getMessage());

      }
    }

  }

}

Any help is appreciated.

You probably don't need this anymore, but this thread was the first result when I searched for how to get verification link in SPI . I guess other people can find it useful. After some time i came up with smth like this:

import org.jboss.logging.Logger;
import org.keycloak.authentication.actiontoken.execactions.ExecuteActionsActionToken;
import org.keycloak.authentication.actiontoken.verifyemail.VerifyEmailActionToken;
import org.keycloak.common.util.Time;
import org.keycloak.email.EmailException;
import org.keycloak.email.EmailTemplateProvider;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.services.Urls;
import org.keycloak.services.resource.RealmResourceProvider;
import org.keycloak.services.resources.LoginActionsService;
import org.keycloak.sessions.AuthenticationSessionCompoundId;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import java.util.*;
import java.util.stream.Collectors;

public class CustomResourceProvider implements RealmResourceProvider {

    private static final Logger log = Logger.getLogger(CustomResourceProvider.class);

    private final KeycloakSession session;

    public CustomResourceProvider(KeycloakSession session) {
        this.session = session;
    }

    @GET
    @Path("users/test2")
    @Produces({MediaType.APPLICATION_JSON})
    public Response sendVerificationLink() throws EmailException {
        RealmModel realm = session.getContext().getRealm();

        final Map<String, String> searchParams = new HashMap<String, String>() {{
            put("emailVerified", "false");
        }};
        final List<UserModel> users = session
                .users()
                .searchForUserStream(realm, searchParams)
                .collect(Collectors.toList());

        EmailTemplateProvider emailTemplateProvider = session.getProvider(EmailTemplateProvider.class);
        for (UserModel user : users) {
            int expiration = Time.currentTime() + 1000000;

            VerifyEmailActionToken token = new VerifyEmailActionToken(
                    user.getId(),
                    expiration,
                    "oasid",
                    user.getEmail(),
                    "localdev"
            );
            UriBuilder builder = LoginActionsService.actionTokenProcessor(session.getContext().getUri());
            builder.queryParam("key", token.serialize(session, realm, session.getContext().getUri()));
            String verificationLink = builder.build(realm.getName()).toString();

            emailTemplateProvider
                    .setRealm(realm)
                    .setUser(user)
                    .sendVerifyEmail(verificationLink, 100000);
        }
        return Response
                .status(Response.Status.OK)
                .entity(users.size())
                .build();
    }

    @Override
    public Object getResource() {
        return this;
    }

    @Override
    public void close() {

    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM