All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.adorsys.oauth.client.protocol.UserInfoResolver Maven / Gradle / Ivy

There is a newer version: 0.35
Show newest version
package de.adorsys.oauth.client.protocol;

import com.nimbusds.oauth2.sdk.token.AccessToken;
import com.nimbusds.oauth2.sdk.token.BearerAccessToken;
import com.nimbusds.openid.connect.sdk.claims.UserInfo;

import de.adorsys.oauth.client.OAuthCredentialHasher;

import org.apache.http.HttpEntity;
import org.apache.http.client.cache.HttpCacheContext;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.cache.CacheConfig;
import org.apache.http.impl.client.cache.CachingHttpClients;
import org.apache.http.impl.client.cache.memcached.SHA256KeyHashingScheme;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.ByteArrayOutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Map;

/**
 * UserInfoResolver
 */
public class UserInfoResolver {

    private static final Logger LOG = LoggerFactory.getLogger(UserInfoResolver.class);

    private URI userInfoEndpoint;

    private CloseableHttpClient cachingHttpClient;

    public static UserInfoResolver from(Map properties) {
        UserInfoResolver userInfoResolver = new UserInfoResolver();
        userInfoResolver.setUserInfoEndpoint(properties.get("userInfoEndpoint"));
        return userInfoResolver.initialize();
    }

    public void setUserInfoEndpoint(String userInfoEndpoint) {
        try {
            this.userInfoEndpoint = new URI(userInfoEndpoint);
        } catch (URISyntaxException e) {
            throw new IllegalStateException("Invalid userInfoEndpoint " + e.getMessage());
        }
    }

    public UserInfoResolver initialize() {

        if (userInfoEndpoint == null) {
            throw new IllegalStateException("UserInfoEndpoint missing");
        }

        CacheConfig cacheConfig = CacheConfig.custom()
                .setMaxCacheEntries(1000)
                .setMaxObjectSize(8192)
                .build();

        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(3000)
                .setConnectionRequestTimeout(3000)
                .setSocketTimeout(3000)
                .build();

        cachingHttpClient = CachingHttpClients.custom()
                .setCacheConfig(cacheConfig)
                .setDefaultRequestConfig(requestConfig)
                .setMaxConnTotal(50)
                .build();
        return this;
    }

    public UserInfo resolve(AccessToken accessToken) {

        try {
            URI userInfoRequest = new URI(String.format("%s?id=%s", userInfoEndpoint.toString(), accessToken.getValue()));
            HttpGet httpGet = new HttpGet(userInfoRequest);
            LOG.debug("load userinfo from {} ", userInfoRequest);
            httpGet.setHeader("Authorization", new BearerAccessToken(accessToken.getValue()).toAuthorizationHeader());

            HttpCacheContext context = HttpCacheContext.create();
            try (CloseableHttpResponse userInfoResponse = cachingHttpClient.execute(httpGet, context)){
                //TODO mask accessToken
                LOG.debug("read userinfo {} {}", OAuthCredentialHasher.hashCredential(accessToken.getValue()), context.getCacheResponseStatus());
                HttpEntity entity = userInfoResponse.getEntity();
                if (userInfoResponse.getStatusLine().getStatusCode() != 200 || entity == null) {
                	LOG.debug("no userInfo available for {}", OAuthCredentialHasher.hashCredential(accessToken.getValue()));
                	return null;
                }
    
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                entity.writeTo(baos);
    
                return UserInfo.parse(baos.toString());
            }
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
    }

    @Override
    public String toString() {
        return String.format("userInfoEndpoint=%s", userInfoEndpoint);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy