Alex9090

Untitled

Jul 20th, 2018
379
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.54 KB | None | 0 0
  1. package ro.gs1.keycloakrecaptha;
  2.  
  3. import java.io.InputStream;
  4. import java.util.LinkedList;
  5. import java.util.List;
  6. import java.util.Map;
  7.  
  8. import org.apache.http.HttpResponse;
  9. import org.apache.http.NameValuePair;
  10. import org.apache.http.client.HttpClient;
  11. import org.apache.http.client.entity.UrlEncodedFormEntity;
  12. import org.apache.http.client.methods.HttpPost;
  13. import org.apache.http.message.BasicNameValuePair;
  14. import org.keycloak.authentication.AuthenticationFlowContext;
  15. import org.keycloak.authentication.Authenticator;
  16. import org.keycloak.authentication.FormContext;
  17. import org.keycloak.authentication.authenticators.browser.AbstractUsernameFormAuthenticator;
  18. import org.keycloak.authentication.authenticators.browser.UsernamePasswordForm;
  19. import org.keycloak.connections.httpclient.HttpClientProvider;
  20. import org.keycloak.forms.login.LoginFormsProvider;
  21. import org.keycloak.models.AuthenticatorConfigModel;
  22. import org.keycloak.models.KeycloakSession;
  23. import org.keycloak.models.RealmModel;
  24. import org.keycloak.models.UserModel;
  25. import org.keycloak.services.ServicesLogger;
  26. import org.keycloak.util.JsonSerialization;
  27. import org.slf4j.Logger;
  28. import org.slf4j.LoggerFactory;
  29.  
  30. public class RecapthaForm extends UsernamePasswordForm implements Authenticator {
  31.     /**
  32.      * Logger for this class
  33.      */
  34.     private static final Logger logger = LoggerFactory.getLogger(RecapthaForm.class);
  35.  
  36.     // private final static Logger log =
  37.     // Logger.getLogger(RecapthaForm.class.getName(), null);
  38.     public static final String G_RECAPTCHA_RESPONSE = "g-recaptcha-response";
  39.     // public static final String RECAPTCHA_REFERENCE_CATEGORY = "recaptcha";
  40.     public static final String SITE_KEY = "site.key";
  41.     public static final String SITE_SECRET = "secret";
  42.  
  43.     @Override
  44.     public void close() {
  45.  
  46.     }
  47.  
  48.     public RecapthaForm() {
  49.         super();
  50.         if (logger.isDebugEnabled()) {
  51.             logger.debug("RecapthaForm() - start");
  52.         }
  53.         if (logger.isDebugEnabled()) {
  54.             logger.debug("RecapthaForm() - end");
  55.         }
  56.     }
  57.  
  58.     @Override
  59.     public void action(AuthenticationFlowContext context) {
  60.         if (logger.isDebugEnabled()) {
  61.             logger.debug("action(AuthenticationFlowContext) - start");
  62.         }
  63.         AuthenticatorConfigModel captchaConfig = context.getAuthenticatorConfig();
  64.         if (captchaConfig != null) {
  65.             Map<String, String> econd = captchaConfig.getConfig();
  66.             logger.debug("Am in config in context: {}", econd);
  67.             context.form().addScript("https://www.google.com/recaptcha/api.js");
  68.             context.form().setAttribute("recaptchaRequired", true);
  69.             context.form().setAttribute("recaptchaSiteKey", econd.get(SITE_KEY));
  70.         }
  71.         super.action(context);
  72.         if (logger.isDebugEnabled()) {
  73.             logger.debug("action(AuthenticationFlowContext) - end");
  74.         }
  75.     }
  76.  
  77.     protected boolean validateRecaptcha(AuthenticationFlowContext context, boolean success, String captcha,
  78.             String secret) {
  79.         HttpClient httpClient = context.getSession().getProvider(HttpClientProvider.class).getHttpClient();
  80.         HttpPost post = new HttpPost("https://www.google.com/recaptcha/api/siteverify");
  81.         List<NameValuePair> formparams = new LinkedList<>();
  82.         formparams.add(new BasicNameValuePair("secret", secret));
  83.         formparams.add(new BasicNameValuePair("response", captcha));
  84.         formparams.add(new BasicNameValuePair("remoteip", context.getConnection().getRemoteAddr()));
  85.         try {
  86.             UrlEncodedFormEntity form = new UrlEncodedFormEntity(formparams, "UTF-8");
  87.             post.setEntity(form);
  88.             HttpResponse response = httpClient.execute(post);
  89.             InputStream content = response.getEntity().getContent();
  90.             try {
  91.                 Map json = JsonSerialization.readValue(content, Map.class);
  92.                 Object val = json.get("success");
  93.                 success = Boolean.TRUE.equals(val);
  94.             } finally {
  95.                 content.close();
  96.             }
  97.         } catch (Exception e) {
  98.             ServicesLogger.LOGGER.recaptchaFailed(e);
  99.         }
  100.         return success;
  101.     }
  102.  
  103.     @Override
  104.     public void setRequiredActions(KeycloakSession session, RealmModel realm, UserModel user) {
  105.         if (logger.isDebugEnabled()) {
  106.             logger.debug("setRequiredActions(KeycloakSession, RealmModel, UserModel) - start");
  107.         }
  108.         super.setRequiredActions(session, realm, user);
  109.         if (logger.isDebugEnabled()) {
  110.             logger.debug("setRequiredActions(KeycloakSession, RealmModel, UserModel) - end");
  111.         }
  112.     }
  113.  
  114.     @Override
  115.     public void authenticate(AuthenticationFlowContext context) {
  116.         AuthenticatorConfigModel captchaConfig = context.getAuthenticatorConfig();
  117.         if (captchaConfig != null) {
  118.             Map<String, String> econd = captchaConfig.getConfig();
  119.             logger.debug("Am in config in context: {}", econd);
  120.             context.form().addScript("https://www.google.com/recaptcha/api.js");
  121.             context.form().setAttribute("recaptchaRequired", true);
  122.             context.form().setAttribute("recaptchaSiteKey", econd.get(SITE_KEY));
  123.  
  124.         }
  125.         //if(validateRecaptcha(context, success, captcha, secret))
  126.         super.authenticate(context);
  127.     }
  128.  
  129. }
  130.  
  131.  
  132.  
  133. package ro.gs1.keycloakrecaptha;
  134.  
  135. import java.util.ArrayList;
  136. import java.util.List;
  137.  
  138. import org.keycloak.Config;
  139. import org.keycloak.authentication.Authenticator;
  140. import org.keycloak.authentication.AuthenticatorFactory;
  141. import org.keycloak.authentication.ConfigurableAuthenticatorFactory;
  142. import org.keycloak.models.AuthenticationExecutionModel;
  143. import org.keycloak.models.KeycloakSession;
  144. import org.keycloak.models.KeycloakSessionFactory;
  145. import org.keycloak.provider.ProviderConfigProperty;
  146. import org.slf4j.Logger;
  147. import org.slf4j.LoggerFactory;
  148.  
  149. public class RecapthaFormFactory implements AuthenticatorFactory, ConfigurableAuthenticatorFactory {
  150.     /**
  151.      * Logger for this class
  152.      */
  153.     private static final Logger logger = LoggerFactory.getLogger(RecapthaFormFactory.class);
  154.  
  155.     public static final String SITE_SECRET = "secret";
  156.     public static final String SITE_KEY = "site.key";
  157.     public static final String RECAPTCHA_REFERENCE_CATEGORY = "recaptcha";
  158.     public static final String PROVIDER_ID = "login-recaptcha-action";
  159.     public static final RecapthaForm SINGLETON = new RecapthaForm();
  160.  
  161.     @Override
  162.     public Authenticator create(KeycloakSession session) {
  163.         if (logger.isDebugEnabled()) {
  164.             logger.debug("create(KeycloakSession) - start{}", session.getContext());
  165.         }
  166.         RecapthaForm returnAuthenticator = SINGLETON;
  167.         if (logger.isDebugEnabled()) {
  168.             logger.debug("create(KeycloakSession) - end");
  169.         }
  170.         return returnAuthenticator;
  171.     }
  172.  
  173.     @Override
  174.     public void init(Config.Scope config) {
  175.         if (logger.isDebugEnabled()) {
  176.             logger.debug("init(Config.Scope) - start {}", config);
  177.  
  178.         }
  179.  
  180.         if (logger.isDebugEnabled()) {
  181.             logger.debug("init(Config.Scope) - end");
  182.         }
  183.     }
  184.  
  185.     @Override
  186.     public void postInit(KeycloakSessionFactory factory) {
  187.         if (logger.isDebugEnabled()) {
  188.             logger.debug("postInit(KeycloakSessionFactory) - start");
  189.         }
  190.  
  191.         if (logger.isDebugEnabled()) {
  192.             logger.debug("postInit(KeycloakSessionFactory) - end");
  193.         }
  194.     }
  195.  
  196.     @Override
  197.     public void close() {
  198.  
  199.     }
  200.  
  201.     @Override
  202.     public String getId() {
  203.         return PROVIDER_ID;
  204.     }
  205.  
  206.     @Override
  207.     public String getReferenceCategory() {
  208.         return RECAPTCHA_REFERENCE_CATEGORY;
  209.     }
  210.  
  211.     @Override
  212.     public boolean isConfigurable() {
  213.         return true;
  214.     }
  215.  
  216.     public static final AuthenticationExecutionModel.Requirement[] REQUIREMENT_CHOICES = {
  217.             AuthenticationExecutionModel.Requirement.REQUIRED, AuthenticationExecutionModel.Requirement.DISABLED };
  218.  
  219.     @Override
  220.     public AuthenticationExecutionModel.Requirement[] getRequirementChoices() {
  221.         return REQUIREMENT_CHOICES;
  222.     }
  223.  
  224.     @Override
  225.     public String getDisplayType() {
  226.         return "Recapthca and username password form";
  227.     }
  228.  
  229.     @Override
  230.     public String getHelpText() {
  231.         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.";
  232.     }
  233.  
  234.     private static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
  235.  
  236.     static {
  237.         ProviderConfigProperty property = new ProviderConfigProperty();
  238.         property.setName(SITE_KEY);
  239.         property.setLabel("Recaptcha Site Key");
  240.         property.setType(ProviderConfigProperty.STRING_TYPE);
  241.         property.setHelpText("Google Recaptcha Site Key");
  242.         configProperties.add(property);
  243.         property = new ProviderConfigProperty();
  244.         property.setName(SITE_SECRET);
  245.         property.setLabel("Recaptcha Secret");
  246.         property.setType(ProviderConfigProperty.STRING_TYPE);
  247.         property.setHelpText("Google Recaptcha Secret");
  248.         configProperties.add(property);
  249.     }
  250.  
  251.     @Override
  252.     public List<ProviderConfigProperty> getConfigProperties() {
  253.         return configProperties;
  254.     }
  255.  
  256.     @Override
  257.     public boolean isUserSetupAllowed() {
  258.         return false;
  259.     }
  260.  
  261. }
Advertisement
Add Comment
Please, Sign In to add comment