Goal
Sample code to make a connection to OAuth Identity Server, authenticate and get the Bearer token...
Service Interface
package app.eaem.api.core.services;
import org.json.JSONObject;
public interface EAEMOAuthService {
public String getBearerToken() throws Exception;
public JSONObject getPhotoNames();
}
Service Implementation
package app.eaem.api.core.services.impl;
import app.eaem.api.core.services.EAEMOAuthService;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.fluent.Form;
import org.apache.http.client.fluent.Request;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.osgi.services.HttpClientBuilderFactory;
import org.json.JSONObject;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Modified;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.AttributeType;
import org.osgi.service.metatype.annotations.Designate;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
@Component(service = EAEMOAuthService.class)
@Designate(ocd = EAEMOAuthServiceImpl.EAEMOAuthConfiguration.class)
public class EAEMOAuthServiceImpl implements EAEMOAuthService {
private static final Logger log = LoggerFactory.getLogger(EAEMOAuthServiceImpl.class);
private String eaemIdentityServerUrl = "";
private String clientId = "";
private String clientSecret = "";
private String scope = "";
private String eaemAppUrl = "";
private String bearerToken = "";
private long tokenExpiryDate = 0;
@Reference
private transient HttpClientBuilderFactory httpClientBuilderFactory;
private transient CloseableHttpClient httpClient;
@Activate
@Modified
protected void activate(final EAEMOAuthConfiguration config) {
eaemIdentityServerUrl = config.eaem_identity_server_url();
clientId = config.eaem_client_id();
clientSecret = config.eaem_client_secret();
scope = config.eaem_scope();
eaemAppUrl = config.eaem_app_url();
final HttpClientBuilder builder = httpClientBuilderFactory.newBuilder();
final RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30000)
.setSocketTimeout(30000).build();
builder.setDefaultRequestConfig(requestConfig);
httpClient = builder.build();
}
public JSONObject getPhotoNames(){
JSONObject photos = new JSONObject();
try{
photos = new JSONObject(makeRequest(eaemAppUrl + "/api/Photos"));
}catch(Exception e){
log.error("Error getting leads", e);
}
return photos;
}
public String getBearerToken() throws Exception{
long rightNow = new Date().getTime();
if(StringUtils.isNotEmpty(bearerToken) && (rightNow < tokenExpiryDate)){
return bearerToken;
}
Form form = Form.form();
form.add("grant_type", "client_credentials");
form.add("client_id", clientId);
form.add("client_secret", clientSecret);
form.add("scope", scope);
String authResponse = Request.Post(eaemIdentityServerUrl)
.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
.bodyForm(form.build()).execute().returnContent().asString();
if(StringUtils.isEmpty(authResponse)){
throw new Exception("Error authenticating with id and secret");
}
JSONObject bearerObj = new JSONObject(authResponse);
bearerToken = bearerObj.getString("access_token");
tokenExpiryDate = new Date().getTime() + (bearerObj.getInt("expires_in") * 1000);
return bearerToken;
}
private String makeRequest(String uri) throws Exception{
return Request.Get(uri)
.addHeader("Authorization", "Bearer " + getBearerToken())
.execute().returnContent().asString();
}
@ObjectClassDefinition(name = "OAuth EAEM Configuration")
public @interface EAEMOAuthConfiguration {
@AttributeDefinition(
name = "EAEM Identity Server Url",
description = "EAEM Identity Server Url",
defaultValue = "https://eaem-idsvr-dev.somehost.com/connect/token",
type = AttributeType.STRING)
String eaem_identity_server_url();
@AttributeDefinition(
name = "EAEM App URL",
description = "EAEM App URL",
defaultValue = "https://eaem-app.somehost.com",
type = AttributeType.STRING)
String eaem_app_url();
@AttributeDefinition(
name = "EAEM Client Id",
description = "EAEM Client Id",
type = AttributeType.STRING)
String eaem_client_id();
@AttributeDefinition(
name = "EAEM Client Secret",
description = "EAEM Client Secret",
type = AttributeType.STRING)
String eaem_client_secret();
@AttributeDefinition(
name = "EAEM App Scope",
description = "EAEM App Scope",
defaultValue = "photos:eaemorg",
type = AttributeType.STRING)
String eaem_scope();
}
}