package org.openiot.security.client.rest;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jboss.resteasy.client.ClientRequest;
import org.jboss.resteasy.client.ClientResponse;
import org.scribe.model.Token;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RestfulOAuthService {
private static Logger log = LoggerFactory.getLogger(RestfulOAuthService.class);
private static final int STATUS_SUCCESS = 201;
private static final int STATUS_DELETE_SUCCESS = 200;
private String casOAuthURL;
public RestfulOAuthService(String casOAuthUrl) {
this.casOAuthURL = casOAuthUrl;
}
public Token getAccessToken(OAuthCredentialsRest credentials) {
Token token = null;
ClientRequest request = new ClientRequest(casOAuthURL);
// String params = "username=" + credentials.getUsername() + "&password=" +
// credentials.getPassword() + "&clientId=" + credentials.getKey() + "&secret="
// + credentials.getSecret();
request.formParameter("username", credentials.getUsername());
request.formParameter("password", credentials.getPassword());
request.formParameter("clientId", credentials.getKey());
request.formParameter("secret", credentials.getSecret());
try {
ClientResponse<String> response = request.post(String.class);
// Read output in string format
log.debug("Status code: {}", response.getStatus());
if (response.getStatus() == STATUS_SUCCESS) {
Matcher matcher = Pattern.compile(".*action=\".*/(.*?)\".*").matcher(response.getEntity());
if (matcher.matches())
token = new Token(matcher.group(1), "");
} else {
log.warn("Invalid response code {} from CAS server!", response.getStatus());
log.info("Response: {}", response.getEntity());
}
response.releaseConnection();
} catch (Exception e) {
log.error("Error while retrieving access token", e);
}
return token;
}
public boolean removeAccessToken(String token) {
boolean deleted = false;
ClientRequest request = new ClientRequest(casOAuthURL + "/" + token);
log.debug("sending request to delete token {}", token);
try {
ClientResponse<String> response = request.delete(String.class);
log.debug("Delete request sent for token {}", token);
log.debug("Status code: {}", response.getStatus());
if (response.getStatus() == STATUS_DELETE_SUCCESS) {
deleted = true;
} else {
log.warn("Invalid response code {} from CAS server!", response.getStatus());
log.info("Response: {}", response.getEntity());
}
} catch (Exception e) {
log.error("Delete request error", e);
}
return deleted;
}
class UsernamePassword {
private String username;
private String password;
public UsernamePassword(String username, String password) {
super();
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
@Override
public String toString() {
return "username=" + username + "&password=" + password;
}
}
}