package org.openiot.security.client.rest; import java.util.Iterator; import org.pac4j.core.context.WebContext; import org.pac4j.core.util.CommonHelper; import org.pac4j.oauth.client.BaseOAuth20Client; import org.pac4j.oauth.client.CasOAuthWrapperClient; import org.pac4j.oauth.credentials.OAuthCredentials; import org.pac4j.oauth.profile.JsonHelper; import org.pac4j.oauth.profile.casoauthwrapper.CasOAuthWrapperProfile; import org.scribe.builder.api.CasOAuthWrapperApi20; import org.scribe.model.OAuthConfig; import org.scribe.model.SignatureType; import org.scribe.model.Token; import org.scribe.oauth.ExtendedOAuth20ServiceImpl; import com.fasterxml.jackson.databind.JsonNode; /** * * Instead implement a Simple Realm that does the authentication! * * @author Mehdi Riahi * */ public class CasOAuthWrapperClientRest extends BaseOAuth20Client<CasOAuthWrapperProfile> { private String casOAuthUrl; private String casOAuthRestUrl; private RestfulOAuthService restfulService; public CasOAuthWrapperClientRest() { } public CasOAuthWrapperClientRest(final String key, final String secret, final String casOAuthUrl) { setKey(key); setSecret(secret); this.casOAuthUrl = casOAuthUrl; } @Override protected CasOAuthWrapperClient newClient() { final CasOAuthWrapperClient newClient = new CasOAuthWrapperClient(); newClient.setCasOAuthUrl(this.casOAuthUrl); return newClient; } @Override protected void internalInit() { super.internalInit(); CommonHelper.assertNotBlank("casOAuthUrl", this.casOAuthUrl); this.service = new ExtendedOAuth20ServiceImpl(new CasOAuthWrapperApi20(this.casOAuthUrl, false), new OAuthConfig(this.key, this.secret, this.callbackUrl, SignatureType.Header, null, null), this.connectTimeout, this.readTimeout, this.proxyHost, this.proxyPort); restfulService = new RestfulOAuthService(casOAuthRestUrl); } @Override protected String getProfileUrl() { return this.casOAuthUrl + "/profile"; } @Override protected CasOAuthWrapperProfile extractUserProfile(final String body) { final CasOAuthWrapperProfile userProfile = new CasOAuthWrapperProfile(); JsonNode json = JsonHelper.getFirstNode(body); if (json != null) { userProfile.setId(JsonHelper.get(json, "id")); json = json.get("attributes"); if (json != null) { final Iterator<JsonNode> nodes = json.iterator(); while (nodes.hasNext()) { json = nodes.next(); final String attribute = json.fieldNames().next(); userProfile.addAttribute(attribute, JsonHelper.get(json, attribute)); } } } return userProfile; } /** * {@inheritDoc} */ @Override protected Token getAccessToken(final OAuthCredentials credentials) { final Token accessToken = restfulService.getAccessToken((OAuthCredentialsRest) credentials); logger.debug("accessToken : {}", accessToken); return accessToken; } public void removeToken(String token) { boolean removed = restfulService.removeAccessToken(token); if (removed) logger.debug("Token {} removed", token); } /** * {@inheritDoc} */ @Override protected OAuthCredentials getOAuthCredentials(final WebContext context) { return new OAuthCredentials("RESTful-no-code!", getName()); } public String getCasOAuthUrl() { return this.casOAuthUrl; } public void setCasOAuthUrl(final String casOAuthUrl) { this.casOAuthUrl = casOAuthUrl; } public String getCasOAuthRestUrl() { return casOAuthRestUrl; } public void setCasOAuthRestUrl(String casOAuthRestUrl) { this.casOAuthRestUrl = casOAuthRestUrl; } @Override protected boolean requiresStateParameter() { return false; } @Override protected boolean hasBeenCancelled(final WebContext context) { return false; } }