package it.inaf.ia2.gms.authn; import java.util.Map; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.security.core.AuthenticationException; import org.springframework.security.oauth2.common.OAuth2AccessToken; import org.springframework.security.oauth2.common.exceptions.InvalidTokenException; import org.springframework.security.oauth2.provider.OAuth2Authentication; import org.springframework.security.oauth2.provider.token.AccessTokenConverter; import org.springframework.security.oauth2.provider.token.ResourceServerTokenServices; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestOperations; import org.springframework.web.client.RestTemplate; /** * Retrieve token data from the user info / check token endpoint using the * returned access token. */ public class GetTokenDataService implements ResourceServerTokenServices { private final RestOperations restTemplate = new RestTemplate(); private String checkTokenEndpointUrl; private String clientId; private AccessTokenConverter tokenConverter; public void setClientId(String clientId) { this.clientId = clientId; } public void setCheckTokenEndpointUrl(String checkTokenEndpointUrl) { this.checkTokenEndpointUrl = checkTokenEndpointUrl; } public void setAccessTokenConverter(AccessTokenConverter accessTokenConverter) { this.tokenConverter = accessTokenConverter; } @Override public OAuth2Authentication loadAuthentication(String accessToken) throws AuthenticationException, InvalidTokenException { MultiValueMap formData = new LinkedMultiValueMap<>(); formData.add("client_id", clientId); HttpHeaders headers = new HttpHeaders(); headers.set("Authorization", "Bearer " + accessToken); Map map = postForMap(checkTokenEndpointUrl, formData, headers); return this.tokenConverter.extractAuthentication(map); } private Map postForMap(String path, MultiValueMap formData, HttpHeaders headers) { if (headers.getContentType() == null) { headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); } return restTemplate.exchange(path, HttpMethod.POST, new HttpEntity<>(formData, headers), Map.class).getBody(); } @Override public OAuth2AccessToken readAccessToken(String accessToken) { throw new UnsupportedOperationException("Not supported: read access token"); } }