/* * oxAuth is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text. * * Copyright (c) 2014, Gluu */ package org.xdi.oxauth.client; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import org.jboss.resteasy.client.ClientExecutor; import org.jboss.resteasy.client.ClientRequest; import org.jboss.resteasy.client.ClientResponse; import org.xdi.oxauth.model.discovery.WebFingerLink; import javax.ws.rs.HttpMethod; import javax.ws.rs.core.MediaType; import java.net.URISyntaxException; import static org.xdi.oxauth.model.discovery.WebFingerParam.*; /** * @author Javier Rojas Blum * @version December 26, 2016 */ public class OpenIdConnectDiscoveryClient extends BaseClient<OpenIdConnectDiscoveryRequest, OpenIdConnectDiscoveryResponse> { private static final Logger LOG = Logger.getLogger(OpenIdConnectDiscoveryClient.class); private static final String MEDIA_TYPE = MediaType.APPLICATION_JSON; private static final String SCHEMA = "https://"; private static final String PATH = "/.well-known/webfinger"; public OpenIdConnectDiscoveryClient(String resource) throws URISyntaxException { setRequest(new OpenIdConnectDiscoveryRequest(resource)); setUrl(SCHEMA + getRequest().getHost() + PATH); } @Override public String getHttpMethod() { return HttpMethod.GET; } public OpenIdConnectDiscoveryResponse exec() { initClientRequest(); return _exec(); } @Deprecated public OpenIdConnectDiscoveryResponse exec(ClientExecutor executor) { this.clientRequest = new ClientRequest(getUrl(), executor); return _exec(); } private OpenIdConnectDiscoveryResponse _exec() { OpenIdConnectDiscoveryResponse response = null; try { response = _exec2(); } catch (Exception e) { LOG.error(e.getMessage(), e); } finally { closeConnection(); } return response; } private OpenIdConnectDiscoveryResponse _exec2() { // Prepare request parameters clientRequest.accept(MEDIA_TYPE); clientRequest.setHttpMethod(getHttpMethod()); if (StringUtils.isNotBlank(getRequest().getResource())) { clientRequest.queryParameter(RESOURCE, getRequest().getResource()); } clientRequest.queryParameter(REL, REL_VALUE); // Call REST Service and handle response ClientResponse<String> clientResponse1; try { clientResponse1 = clientRequest.get(String.class); int status = clientResponse1.getStatus(); setResponse(new OpenIdConnectDiscoveryResponse(status)); String entity = clientResponse1.getEntity(String.class); getResponse().setEntity(entity); getResponse().setHeaders(clientResponse1.getMetadata()); if (StringUtils.isNotBlank(entity)) { JSONObject jsonObj = new JSONObject(entity); getResponse().setSubject(jsonObj.getString(SUBJECT)); JSONArray linksJsonArray = jsonObj.getJSONArray(LINKS); for (int i = 0; i < linksJsonArray.length(); i++) { WebFingerLink webFingerLink = new WebFingerLink(); webFingerLink.setRel(linksJsonArray.getJSONObject(i).getString(REL)); webFingerLink.setHref(linksJsonArray.getJSONObject(i).getString(HREF)); getResponse().getLinks().add(webFingerLink); } } } catch (JSONException e) { LOG.error(e.getMessage(), e); } catch (Exception e) { LOG.error(e.getMessage(), e); } return getResponse(); } }