Skip to content

Commit c0eacc0

Browse files
committed
Disable generating jwt on claim retrieval failure by a config
1 parent 5ee9d1e commit c0eacc0

File tree

7 files changed

+37
-11
lines changed

7 files changed

+37
-11
lines changed

Diff for: components/apimgt/org.wso2.carbon.apimgt.gateway/src/main/java/org/wso2/carbon/apimgt/gateway/handlers/security/jwt/JWTValidator.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ private String generateAndRetrieveJWTToken(String tokenSignature, JWTInfoDto jwt
427427
return endUserToken;
428428
}
429429

430-
private void includeUserStoreClaimsIntoClaims(JWTInfoDto jwtInfoDto) {
430+
private void includeUserStoreClaimsIntoClaims(JWTInfoDto jwtInfoDto) throws JWTGeneratorException {
431431

432432
JWTInfoDto localJWTInfoDto = new JWTInfoDto(jwtInfoDto);
433433
Map<String, String> userClaimsFromKeyManager = getUserClaimsFromKeyManager(localJWTInfoDto);
@@ -859,7 +859,7 @@ protected Cache getGatewayJWTTokenCache() {
859859

860860
return CacheProvider.getGatewayJWTTokenCache();
861861
}
862-
private Map<String, String> getUserClaimsFromKeyManager(JWTInfoDto jwtInfoDto) {
862+
private Map<String, String> getUserClaimsFromKeyManager(JWTInfoDto jwtInfoDto) throws JWTGeneratorException {
863863

864864
if (jwtConfigurationDto.isEnableUserClaimRetrievalFromUserStore()) {
865865
String tenantDomain = CarbonContext.getThreadLocalCarbonContext().getTenantDomain();
@@ -881,7 +881,11 @@ private Map<String, String> getUserClaimsFromKeyManager(JWTInfoDto jwtInfoDto) {
881881
try {
882882
return keyManagerInstance.getUserClaims(jwtInfoDto.getEndUser(), properties);
883883
} catch (APIManagementException e) {
884-
log.error("Error while retrieving User claims from Key Manager ", e);
884+
if (jwtConfigurationDto.isContinueOnClaimRetrievalFailure()) {
885+
log.error("Error while retrieving User Claims from Key Manager ", e);
886+
} else {
887+
throw new JWTGeneratorException("Error while retrieving User Claims from Key Manager", e);
888+
}
885889
}
886890
}
887891
}

Diff for: components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConstants.java

+1
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,7 @@ private AI() {
676676
public static final String VALUE = "value";
677677
public static final String GATEWAY_INTROSPECT_CACHE_NAME = "GatewayIntrospectCache";
678678
public static final String ENABLE_USER_CLAIMS_RETRIEVAL_FROM_KEY_MANAGER = "EnableUserClaimRetrievalFromKeyManager";
679+
public static final String CONTINUE_ON_CLAIM_RETRIEVAL_FAILURE = "ContinueOnClaimRetrievalFailure";
679680

680681
public static final String DELEM_COLON = ":";
681682
public static final String DELEM_COMMA = ",";

Diff for: components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIManagerConfiguration.java

+6
Original file line numberDiff line numberDiff line change
@@ -1845,6 +1845,12 @@ private void setJWTConfiguration(OMElement omElement) {
18451845
}
18461846
}
18471847
}
1848+
OMElement continueOnCustomClaimRetrievalFailureElement =
1849+
omElement.getFirstChildWithName(new QName(APIConstants.CONTINUE_ON_CLAIM_RETRIEVAL_FAILURE));
1850+
if (continueOnCustomClaimRetrievalFailureElement != null) {
1851+
jwtConfigurationDto.setContinueOnClaimRetrievalFailure(
1852+
Boolean.parseBoolean(continueOnCustomClaimRetrievalFailureElement.getText()));
1853+
}
18481854
OMElement enableBase64PaddingElement = gatewayJWTConfigurationElement.getFirstChildWithName(
18491855
new QName(APIConstants.ENABLE_BASE64_PADDING));
18501856
if (enableBase64PaddingElement != null) {

Diff for: components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/dto/ExtendedJWTConfigurationDto.java

+9
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ public class ExtendedJWTConfigurationDto extends JWTConfigurationDto {
66
private String jwtGeneratorImplClass = "org.wso2.carbon.apimgt.keymgt.token.JWTGenerator";
77
private String claimRetrieverImplClass;
88
private boolean tenantBasedSigningEnabled;
9+
private boolean continueOnClaimRetrievalFailure;
910
private boolean enableUserClaimRetrievalFromUserStore;
1011
private boolean isBindFederatedUserClaims;
1112
private boolean isJWKSApiEnabled;
@@ -50,6 +51,14 @@ public boolean isEnableUserClaimRetrievalFromUserStore() {
5051
return enableUserClaimRetrievalFromUserStore;
5152
}
5253

54+
public boolean isContinueOnClaimRetrievalFailure() {
55+
return continueOnClaimRetrievalFailure;
56+
}
57+
58+
public void setContinueOnClaimRetrievalFailure(boolean continueOnClaimRetrievalFailure) {
59+
this.continueOnClaimRetrievalFailure = continueOnClaimRetrievalFailure;
60+
}
61+
5362
public boolean isBindFederatedUserClaims() {
5463

5564
return isBindFederatedUserClaims;

Diff for: components/apimgt/org.wso2.carbon.apimgt.keymgt/src/main/java/org/wso2/carbon/apimgt/keymgt/handlers/AbstractKeyValidationHandler.java

+11-8
Original file line numberDiff line numberDiff line change
@@ -133,17 +133,20 @@ protected boolean hasTokenRequiredAuthLevel(String authScheme,
133133
@Override
134134
public boolean generateConsumerToken(TokenValidationContext validationContext) throws APIKeyMgtException {
135135

136-
136+
String jwt;
137137
try {
138-
String jwt = getCachedJWTToken(validationContext);
139-
validationContext.getValidationInfoDTO().setEndUserToken(jwt);
140-
return true;
141-
138+
jwt = getCachedJWTToken(validationContext);
142139
} catch (APIManagementException e) {
143-
log.error("Error occurred while generating JWT. ", e);
140+
if (!(ServiceReferenceHolder.getInstance().getAPIManagerConfigurationService().getAPIManagerConfiguration()
141+
.getJwtConfigurationDto().isContinueOnClaimRetrievalFailure())) {
142+
throw new APIKeyMgtException("Error occurred while generating JWT", e);
143+
} else {
144+
log.error("Error occurred while generating JWT. ", e);
145+
return false;
146+
}
144147
}
145-
146-
return false;
148+
validationContext.getValidationInfoDTO().setEndUserToken(jwt);
149+
return true;
147150
}
148151

149152
private String getCachedJWTToken(TokenValidationContext validationContext) throws APIManagementException {

Diff for: features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/conf_templates/org.wso2.carbon.apimgt.core.default.json

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"apim.jwt.encode_x5t_without_padding": false,
3333
"apim.jwt.enable_tenant_based_signing": false,
3434
"apim.jwt.gateway_generator.enable_claim_retrieval": false,
35+
"apim.jwt.continue_on_claim_retrieval_failure": true,
3536
"apim.jwt.binding_federated_user_claims": false,
3637
"apim.hashing.hashing_algorithm": "SHA-256",
3738
"apim.cache.gateway_token.enable": true,

Diff for: features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/conf_templates/templates/repository/conf/api-manager.xml.j2

+2
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@
8686
<!-- This parameter specifies which implementation should be used for generating the Token. For URL safe JWT
8787
Token generation the implementation is provided in URLSafeJWTGenerator -->
8888
<!--<JWTGeneratorImpl>org.wso2.carbon.apimgt.keymgt.token.URLSafeJWTGenerator</JWTGeneratorImpl>-->
89+
<ContinueOnClaimRetrievalFailure>{{apim.jwt.continue_on_claim_retrieval_failure}}</ContinueOnClaimRetrievalFailure>
90+
8991
{% if apim.jwt.enable_tenant_based_signing is defined %}
9092
<EnableTenantBasedSigning>{{apim.jwt.enable_tenant_based_signing}}</EnableTenantBasedSigning>
9193
{% endif %}

0 commit comments

Comments
 (0)