Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package ro.gs1.keycloakrecaptha;
- import java.io.InputStream;
- import java.util.LinkedList;
- import java.util.List;
- import java.util.Map;
- import org.apache.http.HttpResponse;
- import org.apache.http.NameValuePair;
- import org.apache.http.client.HttpClient;
- import org.apache.http.client.entity.UrlEncodedFormEntity;
- import org.apache.http.client.methods.HttpPost;
- import org.apache.http.message.BasicNameValuePair;
- import org.keycloak.authentication.AuthenticationFlowContext;
- import org.keycloak.authentication.Authenticator;
- import org.keycloak.authentication.FormContext;
- import org.keycloak.authentication.authenticators.browser.AbstractUsernameFormAuthenticator;
- import org.keycloak.authentication.authenticators.browser.UsernamePasswordForm;
- import org.keycloak.connections.httpclient.HttpClientProvider;
- import org.keycloak.forms.login.LoginFormsProvider;
- import org.keycloak.models.AuthenticatorConfigModel;
- import org.keycloak.models.KeycloakSession;
- import org.keycloak.models.RealmModel;
- import org.keycloak.models.UserModel;
- import org.keycloak.services.ServicesLogger;
- import org.keycloak.util.JsonSerialization;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- public class RecapthaForm extends UsernamePasswordForm implements Authenticator {
- /**
- * Logger for this class
- */
- private static final Logger logger = LoggerFactory.getLogger(RecapthaForm.class);
- // private final static Logger log =
- // Logger.getLogger(RecapthaForm.class.getName(), null);
- public static final String G_RECAPTCHA_RESPONSE = "g-recaptcha-response";
- // public static final String RECAPTCHA_REFERENCE_CATEGORY = "recaptcha";
- public static final String SITE_KEY = "site.key";
- public static final String SITE_SECRET = "secret";
- @Override
- public void close() {
- }
- public RecapthaForm() {
- super();
- if (logger.isDebugEnabled()) {
- logger.debug("RecapthaForm() - start");
- }
- if (logger.isDebugEnabled()) {
- logger.debug("RecapthaForm() - end");
- }
- }
- @Override
- public void action(AuthenticationFlowContext context) {
- if (logger.isDebugEnabled()) {
- logger.debug("action(AuthenticationFlowContext) - start");
- }
- AuthenticatorConfigModel captchaConfig = context.getAuthenticatorConfig();
- if (captchaConfig != null) {
- Map<String, String> econd = captchaConfig.getConfig();
- logger.debug("Am in config in context: {}", econd);
- context.form().addScript("https://www.google.com/recaptcha/api.js");
- context.form().setAttribute("recaptchaRequired", true);
- context.form().setAttribute("recaptchaSiteKey", econd.get(SITE_KEY));
- }
- super.action(context);
- if (logger.isDebugEnabled()) {
- logger.debug("action(AuthenticationFlowContext) - end");
- }
- }
- protected boolean validateRecaptcha(AuthenticationFlowContext context, boolean success, String captcha,
- String secret) {
- HttpClient httpClient = context.getSession().getProvider(HttpClientProvider.class).getHttpClient();
- HttpPost post = new HttpPost("https://www.google.com/recaptcha/api/siteverify");
- List<NameValuePair> formparams = new LinkedList<>();
- formparams.add(new BasicNameValuePair("secret", secret));
- formparams.add(new BasicNameValuePair("response", captcha));
- formparams.add(new BasicNameValuePair("remoteip", context.getConnection().getRemoteAddr()));
- try {
- UrlEncodedFormEntity form = new UrlEncodedFormEntity(formparams, "UTF-8");
- post.setEntity(form);
- HttpResponse response = httpClient.execute(post);
- InputStream content = response.getEntity().getContent();
- try {
- Map json = JsonSerialization.readValue(content, Map.class);
- Object val = json.get("success");
- success = Boolean.TRUE.equals(val);
- } finally {
- content.close();
- }
- } catch (Exception e) {
- ServicesLogger.LOGGER.recaptchaFailed(e);
- }
- return success;
- }
- @Override
- public void setRequiredActions(KeycloakSession session, RealmModel realm, UserModel user) {
- if (logger.isDebugEnabled()) {
- logger.debug("setRequiredActions(KeycloakSession, RealmModel, UserModel) - start");
- }
- super.setRequiredActions(session, realm, user);
- if (logger.isDebugEnabled()) {
- logger.debug("setRequiredActions(KeycloakSession, RealmModel, UserModel) - end");
- }
- }
- @Override
- public void authenticate(AuthenticationFlowContext context) {
- AuthenticatorConfigModel captchaConfig = context.getAuthenticatorConfig();
- if (captchaConfig != null) {
- Map<String, String> econd = captchaConfig.getConfig();
- logger.debug("Am in config in context: {}", econd);
- context.form().addScript("https://www.google.com/recaptcha/api.js");
- context.form().setAttribute("recaptchaRequired", true);
- context.form().setAttribute("recaptchaSiteKey", econd.get(SITE_KEY));
- }
- //if(validateRecaptcha(context, success, captcha, secret))
- super.authenticate(context);
- }
- }
- package ro.gs1.keycloakrecaptha;
- import java.util.ArrayList;
- import java.util.List;
- import org.keycloak.Config;
- import org.keycloak.authentication.Authenticator;
- import org.keycloak.authentication.AuthenticatorFactory;
- import org.keycloak.authentication.ConfigurableAuthenticatorFactory;
- import org.keycloak.models.AuthenticationExecutionModel;
- import org.keycloak.models.KeycloakSession;
- import org.keycloak.models.KeycloakSessionFactory;
- import org.keycloak.provider.ProviderConfigProperty;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- public class RecapthaFormFactory implements AuthenticatorFactory, ConfigurableAuthenticatorFactory {
- /**
- * Logger for this class
- */
- private static final Logger logger = LoggerFactory.getLogger(RecapthaFormFactory.class);
- public static final String SITE_SECRET = "secret";
- public static final String SITE_KEY = "site.key";
- public static final String RECAPTCHA_REFERENCE_CATEGORY = "recaptcha";
- public static final String PROVIDER_ID = "login-recaptcha-action";
- public static final RecapthaForm SINGLETON = new RecapthaForm();
- @Override
- public Authenticator create(KeycloakSession session) {
- if (logger.isDebugEnabled()) {
- logger.debug("create(KeycloakSession) - start{}", session.getContext());
- }
- RecapthaForm returnAuthenticator = SINGLETON;
- if (logger.isDebugEnabled()) {
- logger.debug("create(KeycloakSession) - end");
- }
- return returnAuthenticator;
- }
- @Override
- public void init(Config.Scope config) {
- if (logger.isDebugEnabled()) {
- logger.debug("init(Config.Scope) - start {}", config);
- }
- if (logger.isDebugEnabled()) {
- logger.debug("init(Config.Scope) - end");
- }
- }
- @Override
- public void postInit(KeycloakSessionFactory factory) {
- if (logger.isDebugEnabled()) {
- logger.debug("postInit(KeycloakSessionFactory) - start");
- }
- if (logger.isDebugEnabled()) {
- logger.debug("postInit(KeycloakSessionFactory) - end");
- }
- }
- @Override
- public void close() {
- }
- @Override
- public String getId() {
- return PROVIDER_ID;
- }
- @Override
- public String getReferenceCategory() {
- return RECAPTCHA_REFERENCE_CATEGORY;
- }
- @Override
- public boolean isConfigurable() {
- return true;
- }
- public static final AuthenticationExecutionModel.Requirement[] REQUIREMENT_CHOICES = {
- AuthenticationExecutionModel.Requirement.REQUIRED, AuthenticationExecutionModel.Requirement.DISABLED };
- @Override
- public AuthenticationExecutionModel.Requirement[] getRequirementChoices() {
- return REQUIREMENT_CHOICES;
- }
- @Override
- public String getDisplayType() {
- return "Recapthca and username password form";
- }
- @Override
- public String getHelpText() {
- return "Adds Google Recaptcha button. Recaptchas verify that the entity that is registering is a human. This can only be used on the internet and must be configured after you add it.";
- }
- private static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
- static {
- ProviderConfigProperty property = new ProviderConfigProperty();
- property.setName(SITE_KEY);
- property.setLabel("Recaptcha Site Key");
- property.setType(ProviderConfigProperty.STRING_TYPE);
- property.setHelpText("Google Recaptcha Site Key");
- configProperties.add(property);
- property = new ProviderConfigProperty();
- property.setName(SITE_SECRET);
- property.setLabel("Recaptcha Secret");
- property.setType(ProviderConfigProperty.STRING_TYPE);
- property.setHelpText("Google Recaptcha Secret");
- configProperties.add(property);
- }
- @Override
- public List<ProviderConfigProperty> getConfigProperties() {
- return configProperties;
- }
- @Override
- public boolean isUserSetupAllowed() {
- return false;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment