mirror of
https://repository.entgra.net/community/device-mgt-core.git
synced 2025-10-06 02:01:45 +00:00
Refactored dynamic-client registration
This commit is contained in:
parent
3445c49225
commit
cb9616b02b
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
package org.wso2.carbon.dynamic.client.web.app.registration;
|
package org.wso2.carbon.dynamic.client.web.app.registration;
|
||||||
|
|
||||||
|
import org.apache.catalina.core.StandardContext;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.wso2.carbon.dynamic.client.registration.DynamicClientRegistrationException;
|
import org.wso2.carbon.dynamic.client.registration.DynamicClientRegistrationException;
|
||||||
@ -25,8 +26,11 @@ import org.wso2.carbon.dynamic.client.registration.DynamicClientRegistrationServ
|
|||||||
import org.wso2.carbon.dynamic.client.registration.OAuthApplicationInfo;
|
import org.wso2.carbon.dynamic.client.registration.OAuthApplicationInfo;
|
||||||
import org.wso2.carbon.dynamic.client.registration.profile.RegistrationProfile;
|
import org.wso2.carbon.dynamic.client.registration.profile.RegistrationProfile;
|
||||||
import org.wso2.carbon.dynamic.client.web.app.registration.internal.DynamicClientRegistrationDataHolder;
|
import org.wso2.carbon.dynamic.client.web.app.registration.internal.DynamicClientRegistrationDataHolder;
|
||||||
|
import org.wso2.carbon.dynamic.client.web.app.registration.util.DynamicClientRegistrationConstants;
|
||||||
import org.wso2.carbon.dynamic.client.web.app.registration.util.DynamicClientWebAppRegistrationUtil;
|
import org.wso2.carbon.dynamic.client.web.app.registration.util.DynamicClientWebAppRegistrationUtil;
|
||||||
|
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class contains the logic to handle the OAuth application creation process.
|
* This class contains the logic to handle the OAuth application creation process.
|
||||||
*/
|
*/
|
||||||
@ -50,31 +54,47 @@ public class DynamicRegistrationManager {
|
|||||||
return dynamicRegistrationManager;
|
return dynamicRegistrationManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean registerOAuthApplication(RegistrationProfile registrationProfile) {
|
public OAuthApp registerOAuthApplication(RegistrationProfile registrationProfile) {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Registering OAuth application for web app : " + registrationProfile.getClientName());
|
||||||
|
}
|
||||||
|
if (DynamicClientWebAppRegistrationUtil.validateRegistrationProfile(registrationProfile)) {
|
||||||
DynamicClientRegistrationService dynamicClientRegistrationService =
|
DynamicClientRegistrationService dynamicClientRegistrationService =
|
||||||
DynamicClientRegistrationDataHolder.getInstance()
|
DynamicClientRegistrationDataHolder.getInstance()
|
||||||
.getDynamicClientRegistrationService();
|
.getDynamicClientRegistrationService();
|
||||||
try {
|
try {
|
||||||
OAuthApplicationInfo oAuthApplicationInfo =
|
OAuthApplicationInfo oAuthApplicationInfo =
|
||||||
dynamicClientRegistrationService.registerOAuthApplication(registrationProfile);
|
dynamicClientRegistrationService
|
||||||
|
.registerOAuthApplication(registrationProfile);
|
||||||
OAuthApp oAuthApp = new OAuthApp();
|
OAuthApp oAuthApp = new OAuthApp();
|
||||||
oAuthApp.setWebAppName(registrationProfile.getClientName());
|
oAuthApp.setWebAppName(registrationProfile.getClientName());
|
||||||
oAuthApp.setClientName(oAuthApplicationInfo.getClientName());
|
oAuthApp.setClientName(oAuthApplicationInfo.getClientName());
|
||||||
oAuthApp.setClientKey(oAuthApplicationInfo.getClientId());
|
oAuthApp.setClientKey(oAuthApplicationInfo.getClientId());
|
||||||
oAuthApp.setClientSecret(oAuthApplicationInfo.getClientSecret());
|
oAuthApp.setClientSecret(oAuthApplicationInfo.getClientSecret());
|
||||||
//store it in registry
|
//store it in registry
|
||||||
return DynamicClientWebAppRegistrationUtil.putOAuthApplicationData(oAuthApp);
|
if (DynamicClientWebAppRegistrationUtil.putOAuthApplicationData(oAuthApp)) {
|
||||||
} catch (DynamicClientRegistrationException e) {
|
return oAuthApp;
|
||||||
log.error("Error occurred while registering the OAuth application.",e);
|
} else {
|
||||||
|
dynamicClientRegistrationService
|
||||||
|
.unregisterOAuthApplication(registrationProfile.getOwner(),
|
||||||
|
oAuthApplicationInfo.getClientName(),
|
||||||
|
oAuthApplicationInfo.getClientId());
|
||||||
|
log.warn("Error occurred while persisting the OAuth application data in registry.");
|
||||||
}
|
}
|
||||||
return false;
|
} catch (DynamicClientRegistrationException e) {
|
||||||
|
log.error("Error occurred while registering the OAuth application : " +
|
||||||
|
registrationProfile.getClientName(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new OAuthApp();
|
||||||
}
|
}
|
||||||
|
|
||||||
public OAuthApp getOAuthApplicationData(String clientName) {
|
public OAuthApp getOAuthApplicationData(String clientName) {
|
||||||
try {
|
try {
|
||||||
return DynamicClientWebAppRegistrationUtil.getOAuthApplicationData(clientName);
|
return DynamicClientWebAppRegistrationUtil.getOAuthApplicationData(clientName);
|
||||||
} catch (DynamicClientRegistrationException e) {
|
} catch (DynamicClientRegistrationException e) {
|
||||||
log.error("Error occurred while fetching the OAuth application data for web app : " + clientName, e);
|
log.error("Error occurred while fetching the OAuth application data for web app : " +
|
||||||
|
clientName, e);
|
||||||
}
|
}
|
||||||
return new OAuthApp();
|
return new OAuthApp();
|
||||||
}
|
}
|
||||||
@ -87,4 +107,44 @@ public class DynamicRegistrationManager {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void initiateDynamicClientRegistrationProcess(StandardContext context) {
|
||||||
|
ServletContext servletContext = context.getServletContext();
|
||||||
|
String requiredDynamicClientRegistration = servletContext.getInitParameter(
|
||||||
|
DynamicClientRegistrationConstants.DYNAMIC_CLIENT_REQUIRED_FLAG);
|
||||||
|
DynamicRegistrationManager dynamicRegistrationManager =
|
||||||
|
DynamicRegistrationManager.getInstance();
|
||||||
|
//Get the application name from web-context
|
||||||
|
String webAppName = context.getBaseName();
|
||||||
|
RegistrationProfile registrationProfile;
|
||||||
|
OAuthApp oAuthApp = null;
|
||||||
|
//Java web-app section
|
||||||
|
if ((requiredDynamicClientRegistration != null) &&
|
||||||
|
(Boolean.parseBoolean(requiredDynamicClientRegistration))) {
|
||||||
|
//Check whether this is an already registered application
|
||||||
|
if (!dynamicRegistrationManager.isRegisteredOAuthApplication(webAppName)) {
|
||||||
|
//Construct the RegistrationProfile
|
||||||
|
registrationProfile = DynamicClientWebAppRegistrationUtil
|
||||||
|
.constructRegistrationProfile(servletContext, webAppName);
|
||||||
|
//Register the OAuth application
|
||||||
|
oAuthApp = dynamicRegistrationManager.registerOAuthApplication(
|
||||||
|
registrationProfile);
|
||||||
|
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//Jaggery apps
|
||||||
|
OAuthSettings oAuthSettings = DynamicClientWebAppRegistrationUtil
|
||||||
|
.getJaggeryAppOAuthSettings(servletContext);
|
||||||
|
if (oAuthSettings.isRequireDynamicClientRegistration()) {
|
||||||
|
if (!dynamicRegistrationManager.isRegisteredOAuthApplication(webAppName)) {
|
||||||
|
registrationProfile = DynamicClientWebAppRegistrationUtil
|
||||||
|
.constructRegistrationProfile(oAuthSettings, webAppName);
|
||||||
|
oAuthApp = dynamicRegistrationManager
|
||||||
|
.registerOAuthApplication(registrationProfile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DynamicClientWebAppRegistrationUtil.addClientCredentialsToWebContext(oAuthApp,
|
||||||
|
servletContext);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,7 +22,7 @@ import javax.xml.bind.annotation.XmlElement;
|
|||||||
import javax.xml.bind.annotation.XmlRootElement;
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a OAuth application with basic data.
|
* Represents an OAuth application with basic data.
|
||||||
*/
|
*/
|
||||||
@XmlRootElement(name = "OAuthApp")
|
@XmlRootElement(name = "OAuthApp")
|
||||||
public class OAuthApp {
|
public class OAuthApp {
|
||||||
|
|||||||
@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* WSO2 Inc. licenses this file to you under the Apache License,
|
||||||
|
* Version 2.0 (the "License"); you may not use this file except
|
||||||
|
* in compliance with the License.
|
||||||
|
* you may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.wso2.carbon.dynamic.client.web.app.registration;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents OAuthConfiguration data.
|
||||||
|
*/
|
||||||
|
@XmlRootElement(name = "OAuthSettings")
|
||||||
|
public class OAuthSettings {
|
||||||
|
|
||||||
|
private String grantType;
|
||||||
|
private boolean saasApp;
|
||||||
|
private String callbackURL;
|
||||||
|
private String tokenScope;
|
||||||
|
private boolean requireDynamicClientRegistration;
|
||||||
|
|
||||||
|
@XmlElement(name = "saasApp", required = true)
|
||||||
|
public boolean isSaasApp() {
|
||||||
|
return saasApp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSaasApp(boolean saasApp) {
|
||||||
|
this.saasApp = saasApp;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElement(name = "callbackURL", required = false)
|
||||||
|
public String getCallbackURL() {
|
||||||
|
return callbackURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCallbackURL(String callbackURL) {
|
||||||
|
this.callbackURL = callbackURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElement(name = "tokenScope", required = false)
|
||||||
|
public String getTokenScope() {
|
||||||
|
return tokenScope;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTokenScope(String tokenScope) {
|
||||||
|
this.tokenScope = tokenScope;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElement(name = "grantType", required = true)
|
||||||
|
public String getGrantType() {
|
||||||
|
return grantType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGrantType(String grantType) {
|
||||||
|
this.grantType = grantType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElement(name = "requireDynamicClientRegistration", required = true)
|
||||||
|
public boolean isRequireDynamicClientRegistration() {
|
||||||
|
return requireDynamicClientRegistration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRequireDynamicClientRegistration(boolean requireDynamicClientRegistration) {
|
||||||
|
this.requireDynamicClientRegistration = requireDynamicClientRegistration;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -21,6 +21,7 @@ package org.wso2.carbon.dynamic.client.web.app.registration.internal;
|
|||||||
import org.wso2.carbon.dynamic.client.registration.DynamicClientRegistrationService;
|
import org.wso2.carbon.dynamic.client.registration.DynamicClientRegistrationService;
|
||||||
import org.wso2.carbon.registry.core.service.RegistryService;
|
import org.wso2.carbon.registry.core.service.RegistryService;
|
||||||
import org.wso2.carbon.user.core.service.RealmService;
|
import org.wso2.carbon.user.core.service.RealmService;
|
||||||
|
import org.wso2.carbon.utils.ConfigurationContextService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dataholder class of DynamicClient Webapp Registration component.
|
* Dataholder class of DynamicClient Webapp Registration component.
|
||||||
@ -30,9 +31,37 @@ public class DynamicClientRegistrationDataHolder {
|
|||||||
private RealmService realmService;
|
private RealmService realmService;
|
||||||
private RegistryService registryService;
|
private RegistryService registryService;
|
||||||
private DynamicClientRegistrationService dynamicClientRegistrationService;
|
private DynamicClientRegistrationService dynamicClientRegistrationService;
|
||||||
|
private ConfigurationContextService configurationContextService;
|
||||||
|
|
||||||
|
private static DynamicClientRegistrationDataHolder thisInstance =
|
||||||
|
new DynamicClientRegistrationDataHolder();
|
||||||
|
|
||||||
|
private DynamicClientRegistrationDataHolder() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DynamicClientRegistrationDataHolder getInstance() {
|
||||||
|
return thisInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConfigurationContextService getConfigurationContextService() {
|
||||||
|
if(configurationContextService != null){
|
||||||
|
return configurationContextService;
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException("ConfigurationContext service has not initialized properly");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConfigurationContextService(
|
||||||
|
ConfigurationContextService configurationContextService) {
|
||||||
|
this.configurationContextService = configurationContextService;
|
||||||
|
}
|
||||||
|
|
||||||
public DynamicClientRegistrationService getDynamicClientRegistrationService() {
|
public DynamicClientRegistrationService getDynamicClientRegistrationService() {
|
||||||
|
if(dynamicClientRegistrationService != null){
|
||||||
return dynamicClientRegistrationService;
|
return dynamicClientRegistrationService;
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException("DynamicClientRegistration service has not initialized properly");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDynamicClientRegistrationService(
|
public void setDynamicClientRegistrationService(
|
||||||
@ -40,16 +69,12 @@ public class DynamicClientRegistrationDataHolder {
|
|||||||
this.dynamicClientRegistrationService = dynamicClientRegistrationService;
|
this.dynamicClientRegistrationService = dynamicClientRegistrationService;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static DynamicClientRegistrationDataHolder thisInstance = new DynamicClientRegistrationDataHolder();
|
|
||||||
|
|
||||||
private DynamicClientRegistrationDataHolder() {}
|
|
||||||
|
|
||||||
public static DynamicClientRegistrationDataHolder getInstance() {
|
|
||||||
return thisInstance;
|
|
||||||
}
|
|
||||||
|
|
||||||
public RealmService getRealmService() {
|
public RealmService getRealmService() {
|
||||||
|
if(realmService != null){
|
||||||
return realmService;
|
return realmService;
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException("RealmService has not initialized properly");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRealmService(RealmService realmService) {
|
public void setRealmService(RealmService realmService) {
|
||||||
@ -57,7 +82,11 @@ public class DynamicClientRegistrationDataHolder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public RegistryService getRegistryService() {
|
public RegistryService getRegistryService() {
|
||||||
|
if(registryService != null){
|
||||||
return registryService;
|
return registryService;
|
||||||
|
} else {
|
||||||
|
throw new IllegalStateException("Registry Service has not initialized properly");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRegistryService(RegistryService registryService) {
|
public void setRegistryService(RegistryService registryService) {
|
||||||
|
|||||||
@ -24,6 +24,7 @@ import org.osgi.service.component.ComponentContext;
|
|||||||
import org.wso2.carbon.dynamic.client.registration.DynamicClientRegistrationService;
|
import org.wso2.carbon.dynamic.client.registration.DynamicClientRegistrationService;
|
||||||
import org.wso2.carbon.registry.core.service.RegistryService;
|
import org.wso2.carbon.registry.core.service.RegistryService;
|
||||||
import org.wso2.carbon.user.core.service.RealmService;
|
import org.wso2.carbon.user.core.service.RealmService;
|
||||||
|
import org.wso2.carbon.utils.ConfigurationContextService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @scr.component name="org.wso2.carbon.device.manager" immediate="true"
|
* @scr.component name="org.wso2.carbon.device.manager" immediate="true"
|
||||||
@ -45,6 +46,12 @@ import org.wso2.carbon.user.core.service.RealmService;
|
|||||||
* policy="dynamic"
|
* policy="dynamic"
|
||||||
* bind="setDynamicClientService"
|
* bind="setDynamicClientService"
|
||||||
* unbind="unsetDynamicClientService"
|
* unbind="unsetDynamicClientService"
|
||||||
|
* @scr.reference name="config.context.service"
|
||||||
|
* interface="org.wso2.carbon.utils.ConfigurationContextService"
|
||||||
|
* cardinality="0..1"
|
||||||
|
* policy="dynamic"
|
||||||
|
* bind="setConfigurationContextService"
|
||||||
|
* unbind="unsetConfigurationContextService"
|
||||||
*/
|
*/
|
||||||
public class DynamicClientWebAppRegistrationServiceComponent {
|
public class DynamicClientWebAppRegistrationServiceComponent {
|
||||||
|
|
||||||
@ -133,4 +140,28 @@ public class DynamicClientWebAppRegistrationServiceComponent {
|
|||||||
DynamicClientRegistrationDataHolder.getInstance().setDynamicClientRegistrationService(null);
|
DynamicClientRegistrationDataHolder.getInstance().setDynamicClientRegistrationService(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets ConfigurationContext Service.
|
||||||
|
*
|
||||||
|
* @param configurationContextService An instance of ConfigurationContextService
|
||||||
|
*/
|
||||||
|
protected void setConfigurationContextService(ConfigurationContextService configurationContextService) {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Setting ConfigurationContextService");
|
||||||
|
}
|
||||||
|
DynamicClientRegistrationDataHolder.getInstance().setConfigurationContextService(configurationContextService);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unsets ConfigurationContext Service.
|
||||||
|
*
|
||||||
|
* @param configurationContextService An instance of ConfigurationContextService
|
||||||
|
*/
|
||||||
|
protected void unsetConfigurationContextService(ConfigurationContextService configurationContextService) {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Un-setting ConfigurationContextService");
|
||||||
|
}
|
||||||
|
DynamicClientRegistrationDataHolder.getInstance().setConfigurationContextService(null);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,13 +24,7 @@ import org.apache.catalina.LifecycleListener;
|
|||||||
import org.apache.catalina.core.StandardContext;
|
import org.apache.catalina.core.StandardContext;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.wso2.carbon.dynamic.client.registration.DynamicClientRegistrationException;
|
|
||||||
import org.wso2.carbon.dynamic.client.registration.profile.RegistrationProfile;
|
|
||||||
import org.wso2.carbon.dynamic.client.web.app.registration.DynamicRegistrationManager;
|
import org.wso2.carbon.dynamic.client.web.app.registration.DynamicRegistrationManager;
|
||||||
import org.wso2.carbon.dynamic.client.web.app.registration.util.DynamicClientRegistrationConstants;
|
|
||||||
import org.wso2.carbon.dynamic.client.web.app.registration.util.DynamicClientWebAppRegistrationUtil;
|
|
||||||
|
|
||||||
import javax.servlet.ServletContext;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class initiates the dynamic client registration flow for Web applications upon on deployment
|
* This class initiates the dynamic client registration flow for Web applications upon on deployment
|
||||||
@ -46,25 +40,8 @@ public class DynamicClientWebAppDeploymentLifecycleListener implements Lifecycle
|
|||||||
public void lifecycleEvent(LifecycleEvent lifecycleEvent) {
|
public void lifecycleEvent(LifecycleEvent lifecycleEvent) {
|
||||||
if (Lifecycle.AFTER_START_EVENT.equals(lifecycleEvent.getType())) {
|
if (Lifecycle.AFTER_START_EVENT.equals(lifecycleEvent.getType())) {
|
||||||
StandardContext context = (StandardContext) lifecycleEvent.getLifecycle();
|
StandardContext context = (StandardContext) lifecycleEvent.getLifecycle();
|
||||||
ServletContext servletContext = context.getServletContext();
|
DynamicRegistrationManager.getInstance().initiateDynamicClientRegistrationProcess(
|
||||||
String requiredDynamicClientRegistration = servletContext.getInitParameter(
|
context);
|
||||||
DynamicClientRegistrationConstants.DYNAMIC_CLIENT_REQUIRED_FLAG_PARAM);
|
|
||||||
if ((requiredDynamicClientRegistration != null) &&
|
|
||||||
(Boolean.parseBoolean(requiredDynamicClientRegistration))) {
|
|
||||||
DynamicRegistrationManager dynamicRegistrationManager =
|
|
||||||
DynamicRegistrationManager.getInstance();
|
|
||||||
//Get the application name from web-context
|
|
||||||
String webAppName = context.getBaseName();
|
|
||||||
if (!dynamicRegistrationManager.isRegisteredOAuthApplication(webAppName)) {
|
|
||||||
RegistrationProfile registrationProfile = DynamicClientWebAppRegistrationUtil
|
|
||||||
.constructRegistrationProfile(servletContext, webAppName);
|
|
||||||
if(DynamicClientWebAppRegistrationUtil.validateRegistrationProfile(registrationProfile)){
|
|
||||||
dynamicRegistrationManager.registerOAuthApplication(registrationProfile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//TODO: Need to have the necessary logic to handle jaggery webapp scenario
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,8 +27,8 @@ public class DynamicClientRegistrationConstants {
|
|||||||
public final static String OAUTH_APP_NAME = "appName";
|
public final static String OAUTH_APP_NAME = "appName";
|
||||||
public final static String OAUTH_CLIENT_KEY = "clientKey";
|
public final static String OAUTH_CLIENT_KEY = "clientKey";
|
||||||
public final static String OAUTH_CLIENT_SECRET = "clientSecret";
|
public final static String OAUTH_CLIENT_SECRET = "clientSecret";
|
||||||
public final static String DYNAMIC_CLIENT_REQUIRED_FLAG_PARAM =
|
public final static String DYNAMIC_CLIENT_REQUIRED_FLAG =
|
||||||
"require-dynamic-client-registration";
|
"requireDynamicClientRegistration";
|
||||||
|
|
||||||
public static final class ContentTypes {
|
public static final class ContentTypes {
|
||||||
private ContentTypes() {
|
private ContentTypes() {
|
||||||
|
|||||||
@ -18,26 +18,29 @@
|
|||||||
|
|
||||||
package org.wso2.carbon.dynamic.client.web.app.registration.util;
|
package org.wso2.carbon.dynamic.client.web.app.registration.util;
|
||||||
|
|
||||||
|
import com.google.gson.stream.JsonReader;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||||
import org.wso2.carbon.dynamic.client.registration.DynamicClientRegistrationException;
|
import org.wso2.carbon.dynamic.client.registration.DynamicClientRegistrationException;
|
||||||
import org.wso2.carbon.dynamic.client.registration.profile.RegistrationProfile;
|
import org.wso2.carbon.dynamic.client.registration.profile.RegistrationProfile;
|
||||||
import org.wso2.carbon.dynamic.client.web.app.registration.OAuthApp;
|
import org.wso2.carbon.dynamic.client.web.app.registration.OAuthApp;
|
||||||
|
import org.wso2.carbon.dynamic.client.web.app.registration.OAuthSettings;
|
||||||
import org.wso2.carbon.dynamic.client.web.app.registration.internal.DynamicClientRegistrationDataHolder;
|
import org.wso2.carbon.dynamic.client.web.app.registration.internal.DynamicClientRegistrationDataHolder;
|
||||||
import org.wso2.carbon.registry.api.RegistryException;
|
import org.wso2.carbon.registry.api.RegistryException;
|
||||||
import org.wso2.carbon.registry.api.Resource;
|
import org.wso2.carbon.registry.api.Resource;
|
||||||
import org.wso2.carbon.registry.core.Registry;
|
import org.wso2.carbon.registry.core.Registry;
|
||||||
import org.wso2.carbon.user.core.service.RealmService;
|
import org.wso2.carbon.user.core.service.RealmService;
|
||||||
import org.wso2.carbon.utils.CarbonUtils;
|
import org.wso2.carbon.utils.CarbonUtils;
|
||||||
|
import org.wso2.carbon.utils.ConfigurationContextService;
|
||||||
|
import org.wso2.carbon.utils.NetworkUtils;
|
||||||
|
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
import javax.xml.bind.JAXBContext;
|
import javax.xml.bind.JAXBContext;
|
||||||
import javax.xml.bind.JAXBException;
|
import javax.xml.bind.JAXBException;
|
||||||
import javax.xml.bind.Marshaller;
|
import javax.xml.bind.Marshaller;
|
||||||
import javax.xml.bind.Unmarshaller;
|
import javax.xml.bind.Unmarshaller;
|
||||||
import java.io.StringReader;
|
import java.io.*;
|
||||||
import java.io.StringWriter;
|
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -45,12 +48,16 @@ import java.nio.charset.Charset;
|
|||||||
*/
|
*/
|
||||||
public class DynamicClientWebAppRegistrationUtil {
|
public class DynamicClientWebAppRegistrationUtil {
|
||||||
|
|
||||||
private final static String OAUTH_PARAM_GRANT_TYPE = "grant-type";
|
private final static String OAUTH_PARAM_GRANT_TYPE = "grantType";
|
||||||
private final static String OAUTH_PARAM_TOKEN_SCOPE = "token-scope";
|
private final static String OAUTH_PARAM_TOKEN_SCOPE = "tokenScope";
|
||||||
private final static String SP_PARAM_SAAS_APP = "saas-app";
|
private final static String OAUTH_PARAM_SAAS_APP = "saasApp";
|
||||||
|
private final static String OAUTH_PARAM_CALLBACK_URL = "callbackURL";
|
||||||
|
private static final String JAGGERY_APP_OAUTH_CONFIG_PATH =
|
||||||
|
"config" + File.separator + "oauth.json";
|
||||||
|
|
||||||
private static final Log log =
|
private static final Log log =
|
||||||
LogFactory.getLog(DynamicClientWebAppRegistrationUtil.class);
|
LogFactory.getLog(DynamicClientWebAppRegistrationUtil.class);
|
||||||
|
private static final String CHARSET_UTF_8 = "UTF-8";
|
||||||
|
|
||||||
public static Registry getGovernanceRegistry() throws DynamicClientRegistrationException {
|
public static Registry getGovernanceRegistry() throws DynamicClientRegistrationException {
|
||||||
try {
|
try {
|
||||||
@ -68,8 +75,12 @@ public class DynamicClientWebAppRegistrationUtil {
|
|||||||
public static OAuthApp getOAuthApplicationData(String appName)
|
public static OAuthApp getOAuthApplicationData(String appName)
|
||||||
throws DynamicClientRegistrationException {
|
throws DynamicClientRegistrationException {
|
||||||
Resource resource;
|
Resource resource;
|
||||||
String resourcePath = DynamicClientRegistrationConstants.OAUTH_APP_DATA_REGISTRY_PATH + "/" + appName;
|
String resourcePath =
|
||||||
|
DynamicClientRegistrationConstants.OAUTH_APP_DATA_REGISTRY_PATH + "/" + appName;
|
||||||
try {
|
try {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Retrieving OAuth application " + appName + " data from Registry");
|
||||||
|
}
|
||||||
resource = DynamicClientWebAppRegistrationUtil.getRegistryResource(resourcePath);
|
resource = DynamicClientWebAppRegistrationUtil.getRegistryResource(resourcePath);
|
||||||
if (resource != null) {
|
if (resource != null) {
|
||||||
JAXBContext context = JAXBContext.newInstance(OAuthApp.class);
|
JAXBContext context = JAXBContext.newInstance(OAuthApp.class);
|
||||||
@ -92,7 +103,7 @@ public class DynamicClientWebAppRegistrationUtil {
|
|||||||
|
|
||||||
public static boolean putOAuthApplicationData(OAuthApp oAuthApp)
|
public static boolean putOAuthApplicationData(OAuthApp oAuthApp)
|
||||||
throws DynamicClientRegistrationException {
|
throws DynamicClientRegistrationException {
|
||||||
boolean status = false;
|
boolean status;
|
||||||
try {
|
try {
|
||||||
if (log.isDebugEnabled()) {
|
if (log.isDebugEnabled()) {
|
||||||
log.debug("Persisting OAuth application data in Registry");
|
log.debug("Persisting OAuth application data in Registry");
|
||||||
@ -102,19 +113,23 @@ public class DynamicClientWebAppRegistrationUtil {
|
|||||||
Marshaller marshaller = context.createMarshaller();
|
Marshaller marshaller = context.createMarshaller();
|
||||||
marshaller.marshal(oAuthApp, writer);
|
marshaller.marshal(oAuthApp, writer);
|
||||||
|
|
||||||
Resource resource = DynamicClientWebAppRegistrationUtil.getGovernanceRegistry().newResource();
|
Resource resource =
|
||||||
|
DynamicClientWebAppRegistrationUtil.getGovernanceRegistry().newResource();
|
||||||
resource.setContent(writer.toString());
|
resource.setContent(writer.toString());
|
||||||
resource.setMediaType(DynamicClientRegistrationConstants.ContentTypes.MEDIA_TYPE_XML);
|
resource.setMediaType(DynamicClientRegistrationConstants.ContentTypes.MEDIA_TYPE_XML);
|
||||||
String resourcePath =
|
String resourcePath =
|
||||||
DynamicClientRegistrationConstants.OAUTH_APP_DATA_REGISTRY_PATH + "/" +
|
DynamicClientRegistrationConstants.OAUTH_APP_DATA_REGISTRY_PATH + "/" +
|
||||||
oAuthApp.getWebAppName();
|
oAuthApp.getWebAppName();
|
||||||
status = DynamicClientWebAppRegistrationUtil.putRegistryResource(resourcePath, resource);
|
status =
|
||||||
|
DynamicClientWebAppRegistrationUtil.putRegistryResource(resourcePath, resource);
|
||||||
} catch (RegistryException e) {
|
} catch (RegistryException e) {
|
||||||
throw new DynamicClientRegistrationException(
|
throw new DynamicClientRegistrationException(
|
||||||
"Error occurred while persisting OAuth application data : " +
|
"Error occurred while persisting OAuth application data : " +
|
||||||
oAuthApp.getClientName(), e);
|
oAuthApp.getClientName(), e);
|
||||||
} catch (JAXBException e) {
|
} catch (JAXBException e) {
|
||||||
e.printStackTrace();
|
throw new DynamicClientRegistrationException(
|
||||||
|
"Error occurred while parsing the OAuth application data : " +
|
||||||
|
oAuthApp.getWebAppName(), e);
|
||||||
}
|
}
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@ -154,43 +169,154 @@ public class DynamicClientWebAppRegistrationUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getUserName(){
|
public static String getUserName() {
|
||||||
String username = "";
|
String username = "";
|
||||||
RealmService realmService =
|
RealmService realmService =
|
||||||
DynamicClientRegistrationDataHolder.getInstance().getRealmService();
|
DynamicClientRegistrationDataHolder.getInstance().getRealmService();
|
||||||
if(realmService != null){
|
if (realmService != null) {
|
||||||
username = realmService.getBootstrapRealmConfiguration().getAdminUserName();
|
username = realmService.getBootstrapRealmConfiguration().getAdminUserName();
|
||||||
}
|
}
|
||||||
return username;
|
return username;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static RegistrationProfile constructRegistrationProfile(ServletContext servletContext, String webAppName) {
|
public static RegistrationProfile constructRegistrationProfile(ServletContext servletContext,
|
||||||
RegistrationProfile registrationProfile = new RegistrationProfile();
|
String webAppName) {
|
||||||
|
RegistrationProfile registrationProfile;
|
||||||
|
registrationProfile = new RegistrationProfile();
|
||||||
registrationProfile.setGrantType(servletContext.getInitParameter(
|
registrationProfile.setGrantType(servletContext.getInitParameter(
|
||||||
DynamicClientWebAppRegistrationUtil.OAUTH_PARAM_GRANT_TYPE));
|
DynamicClientWebAppRegistrationUtil.OAUTH_PARAM_GRANT_TYPE));
|
||||||
registrationProfile.setTokenScope(servletContext.getInitParameter(
|
registrationProfile.setTokenScope(servletContext.getInitParameter(
|
||||||
DynamicClientWebAppRegistrationUtil.OAUTH_PARAM_TOKEN_SCOPE));
|
DynamicClientWebAppRegistrationUtil.OAUTH_PARAM_TOKEN_SCOPE));
|
||||||
registrationProfile.setOwner(DynamicClientWebAppRegistrationUtil.getUserName());
|
registrationProfile.setOwner(DynamicClientWebAppRegistrationUtil.getUserName());
|
||||||
//TODO : Need to get the hostname properly
|
String callbackURL = servletContext.getInitParameter(
|
||||||
registrationProfile.setCallbackUrl("http://localhost:9763/" + webAppName);
|
DynamicClientWebAppRegistrationUtil.OAUTH_PARAM_CALLBACK_URL);
|
||||||
|
if ((callbackURL != null) && !callbackURL.isEmpty()) {
|
||||||
|
registrationProfile.setCallbackUrl(callbackURL);
|
||||||
|
} else {
|
||||||
|
registrationProfile.setCallbackUrl(DynamicClientWebAppRegistrationUtil.getCallbackUrl(
|
||||||
|
webAppName));
|
||||||
|
}
|
||||||
registrationProfile.setClientName(webAppName);
|
registrationProfile.setClientName(webAppName);
|
||||||
registrationProfile.setSaasApp(Boolean.parseBoolean(servletContext.getInitParameter(
|
registrationProfile.setSaasApp(Boolean.parseBoolean(servletContext.getInitParameter(
|
||||||
DynamicClientWebAppRegistrationUtil.SP_PARAM_SAAS_APP)));
|
DynamicClientWebAppRegistrationUtil.OAUTH_PARAM_SAAS_APP)));
|
||||||
|
|
||||||
|
return registrationProfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RegistrationProfile constructRegistrationProfile(
|
||||||
|
OAuthSettings oAuthSettings, String webAppName) {
|
||||||
|
RegistrationProfile registrationProfile = new RegistrationProfile();
|
||||||
|
if (oAuthSettings != null) {
|
||||||
|
registrationProfile.setGrantType(oAuthSettings.getGrantType());
|
||||||
|
registrationProfile.setTokenScope(oAuthSettings.getTokenScope());
|
||||||
|
registrationProfile.setClientName(webAppName);
|
||||||
|
registrationProfile.setSaasApp(oAuthSettings.isSaasApp());
|
||||||
|
registrationProfile.setOwner(DynamicClientWebAppRegistrationUtil.getUserName());
|
||||||
|
if (oAuthSettings.getCallbackURL() != null) {
|
||||||
|
registrationProfile.setCallbackUrl(oAuthSettings.getCallbackURL());
|
||||||
|
} else {
|
||||||
|
registrationProfile.setCallbackUrl(
|
||||||
|
DynamicClientWebAppRegistrationUtil.getCallbackUrl(webAppName));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.warn(
|
||||||
|
"Please configure OAuth settings properly for jaggery app : " + webAppName);
|
||||||
|
}
|
||||||
return registrationProfile;
|
return registrationProfile;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean validateRegistrationProfile(RegistrationProfile registrationProfile) {
|
public static boolean validateRegistrationProfile(RegistrationProfile registrationProfile) {
|
||||||
boolean status = true;
|
boolean status = true;
|
||||||
if(registrationProfile.getGrantType() == null){
|
if (registrationProfile.getGrantType() == null) {
|
||||||
status = false;
|
status = false;
|
||||||
log.warn("Required parameter 'grant-type' is missing for initiating Dynamic-Client " +
|
log.warn("Required parameter 'grantType' is missing for initiating Dynamic-Client " +
|
||||||
"registration for webapp : " + registrationProfile.getClientName());
|
"registration for webapp : " + registrationProfile.getClientName());
|
||||||
}
|
}
|
||||||
if(registrationProfile.getTokenScope() == null){
|
if (registrationProfile.getTokenScope() == null) {
|
||||||
status = false;
|
status = false;
|
||||||
log.warn("Required parameter 'token-scope' is missing for initiating Dynamic-Client " +
|
log.warn("Required parameter 'tokenScope' is missing for initiating Dynamic-Client " +
|
||||||
"registration for webapp : " + registrationProfile.getClientName());
|
"registration for webapp : " + registrationProfile.getClientName());
|
||||||
}
|
}
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static OAuthSettings getJaggeryAppOAuthSettings(ServletContext servletContext) {
|
||||||
|
OAuthSettings oAuthSettings = new OAuthSettings();
|
||||||
|
try {
|
||||||
|
InputStream inputStream =
|
||||||
|
servletContext.getResourceAsStream(JAGGERY_APP_OAUTH_CONFIG_PATH);
|
||||||
|
if (inputStream != null) {
|
||||||
|
JsonReader reader =
|
||||||
|
new JsonReader(new InputStreamReader(inputStream, CHARSET_UTF_8));
|
||||||
|
reader.beginObject();
|
||||||
|
while (reader.hasNext()) {
|
||||||
|
String key = reader.nextName();
|
||||||
|
switch (key) {
|
||||||
|
case DynamicClientRegistrationConstants.DYNAMIC_CLIENT_REQUIRED_FLAG:
|
||||||
|
oAuthSettings.setRequireDynamicClientRegistration(reader.nextBoolean());
|
||||||
|
break;
|
||||||
|
case DynamicClientWebAppRegistrationUtil.OAUTH_PARAM_GRANT_TYPE:
|
||||||
|
oAuthSettings.setGrantType(reader.nextString());
|
||||||
|
break;
|
||||||
|
case DynamicClientWebAppRegistrationUtil.OAUTH_PARAM_TOKEN_SCOPE:
|
||||||
|
oAuthSettings.setTokenScope(reader.nextString());
|
||||||
|
break;
|
||||||
|
case DynamicClientWebAppRegistrationUtil.OAUTH_PARAM_SAAS_APP:
|
||||||
|
oAuthSettings.setSaasApp(reader.nextBoolean());
|
||||||
|
break;
|
||||||
|
case DynamicClientWebAppRegistrationUtil.OAUTH_PARAM_CALLBACK_URL:
|
||||||
|
oAuthSettings.setCallbackURL(reader.nextString());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return oAuthSettings;
|
||||||
|
}
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
log.error("Error occurred while initializing OAuth settings for the Jaggery app.", e);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Error occurred while initializing OAuth settings for the Jaggery app.", e);
|
||||||
|
}
|
||||||
|
return oAuthSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getServerBaseUrl() {
|
||||||
|
// Hostname
|
||||||
|
String hostName = "localhost";
|
||||||
|
try {
|
||||||
|
hostName = NetworkUtils.getMgtHostName();
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
// HTTPS port
|
||||||
|
String mgtConsoleTransport = CarbonUtils.getManagementTransport();
|
||||||
|
ConfigurationContextService configContextService =
|
||||||
|
DynamicClientRegistrationDataHolder.getInstance().getConfigurationContextService();
|
||||||
|
int port = CarbonUtils.getTransportPort(configContextService, mgtConsoleTransport);
|
||||||
|
int httpsProxyPort =
|
||||||
|
CarbonUtils.getTransportProxyPort(configContextService.getServerConfigContext(),
|
||||||
|
mgtConsoleTransport);
|
||||||
|
if (httpsProxyPort > 0) {
|
||||||
|
port = httpsProxyPort;
|
||||||
|
}
|
||||||
|
return "https://" + hostName + ":" + port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getCallbackUrl(String context) {
|
||||||
|
return getServerBaseUrl() + "/" + context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void addClientCredentialsToWebContext(OAuthApp oAuthApp,
|
||||||
|
ServletContext servletContext) {
|
||||||
|
if(oAuthApp != null){
|
||||||
|
//Check for client credentials
|
||||||
|
if ((oAuthApp.getClientKey() != null && !oAuthApp.getClientKey().isEmpty()) &&
|
||||||
|
(oAuthApp.getClientSecret() != null && !oAuthApp.getClientSecret().isEmpty())) {
|
||||||
|
servletContext.setAttribute(DynamicClientRegistrationConstants.OAUTH_CLIENT_KEY,
|
||||||
|
oAuthApp.getClientKey());
|
||||||
|
servletContext.setAttribute(DynamicClientRegistrationConstants.OAUTH_CLIENT_SECRET,
|
||||||
|
oAuthApp.getClientSecret());
|
||||||
|
} else {
|
||||||
|
log.warn("Client credentials not found for web app : " + oAuthApp.getWebAppName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user