package eu.eudat.logic.security.customproviders.Zenodo; import com.fasterxml.jackson.databind.ObjectMapper; import eu.eudat.logic.security.validators.orcid.helpers.ORCIDResponseToken; import eu.eudat.logic.security.validators.zenodo.helpers.ZenodoResponseToken; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; 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.HttpClientErrorException; import org.springframework.web.client.RestTemplate; import java.io.IOException; import java.util.Collections; import java.util.Map; @Component("ZenodoCustomProvider") public class ZenodoCustomProviderImpl implements ZenodoCustomProvider { private static final Logger logger = LoggerFactory.getLogger(ZenodoCustomProviderImpl.class); private Environment environment; @Autowired public ZenodoCustomProviderImpl(Environment environment) { this.environment = environment; } @Override public ZenodoResponseToken getAccessToken(String code, String clientId, String clientSecret, String redirectUri) { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); headers.setContentType(MediaType.MULTIPART_FORM_DATA); MultiValueMap map = new LinkedMultiValueMap<>(); map.add("client_id", clientId); map.add("client_secret", clientSecret); map.add("grant_type", "authorization_code"); map.add("code", code); map.add("redirect_uri", redirectUri); HttpEntity> request = new HttpEntity<>(map, headers); try { Map values = restTemplate.postForObject(this.environment.getProperty("zenodo.login.access_token_url"), request, Map.class); ZenodoResponseToken zenodoResponseToken = new ZenodoResponseToken(); Map user = (Map) values.get("user"); zenodoResponseToken.setUserId((String) user.get("id")); zenodoResponseToken.setEmail((String) user.get("email")); zenodoResponseToken.setExpiresIn((Integer) values.get("expires_in")); zenodoResponseToken.setAccessToken((String) values.get("access_token")); return zenodoResponseToken; } catch (HttpClientErrorException ex) { logger.error(ex.getResponseBodyAsString(), ex); } return null; } private HttpHeaders createBearerAuthHeaders(String accessToken) { return new HttpHeaders() {{ String authHeader = "Bearer " + accessToken; set("Authorization", authHeader); }}; } }