package eu.eudat.logic.security.customproviders.ConfigurableProvider; import eu.eudat.logic.security.customproviders.ConfigurableProvider.entities.oauth2.Oauth2ConfigurableProviderUserSettings; import eu.eudat.logic.security.validators.configurableProvider.helpers.ConfigurableProviderResponseToken; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.Map; @Component("configurableProviderCustomProvider") public class ConfigurableProviderCustomProviderImpl implements ConfigurableProviderCustomProvider { private static final Logger logger = LoggerFactory.getLogger(ConfigurableProviderCustomProviderImpl.class); @Override public ConfigurableProviderResponseToken getAccessToken(String code, String redirectUri, String clientId, String clientSecret, String accessTokenUrl, String grantType, String access_token, String expires_in) { RestTemplate template = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); MultiValueMap map = new LinkedMultiValueMap(); map.add("grant_type", grantType); map.add("code", code); map.add("redirect_uri", redirectUri); map.add("client_id", clientId); map.add("client_secret", clientSecret); HttpEntity> request = new HttpEntity<>(map, headers); logger.debug("----------------------------------------------"); logger.debug("Sending request to access token url: " + accessTokenUrl); logger.debug("The request sent is: "); map.forEach((key, value) -> logger.debug(key + ": " + value)); logger.debug("----------------------------------------------"); Map values = template.postForObject(accessTokenUrl, request, Map.class); try { logger.debug("----------------------------------------------"); logger.debug("Returned values from access token url request:"); values.forEach((key, value) -> logger.debug(key + ": " + value)); logger.debug("----------------------------------------------"); } catch (NullPointerException e){ logger.error(e.getMessage(), e); values = new HashMap<>(); } ConfigurableProviderResponseToken responseToken = new ConfigurableProviderResponseToken(); responseToken.setAccessToken((String) values.get(access_token)); if (expires_in != null && !expires_in.isEmpty()) { responseToken.setExpiresIn((Integer) values.get(expires_in)); } return responseToken; } @Override public ConfigurableProviderUser getUser(String accessToken, Oauth2ConfigurableProviderUserSettings user) { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = this.createBearerAuthHeaders(accessToken); HttpEntity entity = new HttpEntity<>(headers); logger.debug("----------------------------------------------"); logger.debug("Sending request to user info url: " + user.getUser_info_url()); logger.debug("Using access token: " + accessToken); logger.debug("----------------------------------------------"); Map values = restTemplate.exchange(user.getUser_info_url(), HttpMethod.GET, entity, Map.class).getBody(); try { logger.debug("----------------------------------------------"); logger.debug("Returned values from user info url request:"); values.forEach((key, value) -> logger.debug(key + ": " + value)); logger.debug("-------------------------------------------"); } catch (NullPointerException e){ logger.error(e.getMessage(), e); values = new HashMap<>(); } logger.debug("----------------------------------------------"); logger.debug("Searching in user info response for these fields: " + user.getId() + ", " + user.getName() + ", " + user.getEmail()); logger.debug("----------------------------------------------"); return new ConfigurableProviderUser().getConfigurableProviderUser(values, user); } private HttpHeaders createBearerAuthHeaders(String accessToken) { return new HttpHeaders() {{ String authHeader = "Bearer " + accessToken; set("Authorization", authHeader); }}; } }