Skip to content

Commit cd2e9ec

Browse files
committed
feat(jans-auth-server): injected script service into existing tx token service #8376
1 parent fa430aa commit cd2e9ec

File tree

1 file changed

+38
-5
lines changed

1 file changed

+38
-5
lines changed

jans-auth-server/server/src/main/java/io/jans/as/server/token/ws/rs/TxTokenService.java

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,16 @@
3434
import io.jans.as.server.model.token.JwtSigner;
3535
import io.jans.as.server.service.ClientService;
3636
import io.jans.as.server.service.ServerCryptoProvider;
37+
import io.jans.as.server.service.external.ExternalTxTokenService;
38+
import io.jans.as.server.service.external.context.ExternalScriptContext;
3739
import io.jans.as.server.util.ServerUtil;
3840
import io.jans.model.token.TokenEntity;
3941
import io.jans.util.security.StringEncrypter;
4042
import jakarta.ejb.Stateless;
4143
import jakarta.inject.Inject;
4244
import jakarta.inject.Named;
4345
import jakarta.servlet.http.HttpServletRequest;
46+
import jakarta.ws.rs.WebApplicationException;
4447
import jakarta.ws.rs.core.MediaType;
4548
import jakarta.ws.rs.core.Response;
4649
import org.apache.commons.lang3.StringUtils;
@@ -88,6 +91,9 @@ public class TxTokenService {
8891
@Inject
8992
private AuthorizationGrantList authorizationGrantList;
9093

94+
@Inject
95+
private ExternalTxTokenService externalTxTokenService;
96+
9197
public Response processTxToken(ExecutionContext executionContext) throws Exception {
9298
final JSONObject responseJson = process(executionContext);
9399
final String entity = responseJson.toString();
@@ -106,7 +112,14 @@ private JSONObject process(ExecutionContext executionContext) throws Exception {
106112

107113
TxToken txToken = createTxToken(executionContext, subjectGrant);
108114

109-
return createResponse(txToken.getCode());
115+
JSONObject response = createResponse(txToken.getCode());
116+
JSONObject responseForScript = new JSONObject(response.toString());
117+
118+
if (externalTxTokenService.modifyResponse(responseForScript, ExternalScriptContext.of(executionContext))) {
119+
// change response only if external script returned `true`
120+
response = responseForScript;
121+
}
122+
return response;
110123
}
111124

112125
public static JSONObject createResponse(String txToken) {
@@ -133,7 +146,7 @@ private TxToken createTxToken(ExecutionContext executionContext, AuthorizationGr
133146
final JsonWebResponse jwr = createTxTokenJwr(audience, requestContext, requestDetails, executionContext, subjectGrant);
134147
final String jwrString = jwr.toString();
135148

136-
final int txTokenLifetime = getTxTokenLifetime(client);
149+
final int txTokenLifetime = getTxTokenLifetime(executionContext);
137150
TxToken txToken = new TxToken(txTokenLifetime);
138151
txToken.setCode(jwrString);
139152

@@ -147,10 +160,9 @@ private void fillPayload(JsonWebResponse jwr, String audience, String requestCon
147160

148161
Calendar calendar = Calendar.getInstance();
149162
Date issuedAt = calendar.getTime();
150-
calendar.add(Calendar.SECOND, getTxTokenLifetime(client));
163+
calendar.add(Calendar.SECOND, getTxTokenLifetime(executionContext));
151164
Date expiration = calendar.getTime();
152165

153-
154166
jwr.getClaims().setIssuer(appConfiguration.getIssuer());
155167
jwr.getClaims().setExpirationTime(expiration);
156168
jwr.getClaims().setIat(issuedAt);
@@ -180,6 +192,20 @@ private void fillPayload(JsonWebResponse jwr, String audience, String requestCon
180192
azd.put("client_id", client.getClientId());
181193

182194
jwr.getClaims().setClaim("azd", azd);
195+
196+
boolean externalOk = externalTxTokenService.modifyTokenPayload(jwr, ExternalScriptContext.of(executionContext));
197+
if (!externalOk) {
198+
final String reason = "External TxToken script forbids tx_token creation.";
199+
log.trace(reason);
200+
201+
throw new WebApplicationException(Response
202+
.status(Response.Status.FORBIDDEN)
203+
.type(MediaType.APPLICATION_JSON_TYPE)
204+
.cacheControl(ServerUtil.cacheControl(true, false))
205+
.header("Pragma", "no-cache")
206+
.entity(errorResponseFactory.errorAsJson(TokenErrorResponseType.ACCESS_DENIED, reason))
207+
.build());
208+
}
183209
}
184210

185211
private static JSONObject decodeJson(String jsonString) {
@@ -194,11 +220,18 @@ private static JSONObject decodeJson(String jsonString) {
194220
}
195221
}
196222

197-
private int getTxTokenLifetime(Client client) {
223+
private int getTxTokenLifetime(ExecutionContext executionContext) {
224+
Client client = executionContext.getClient();
198225
if (client.getAttributes().getTxTokenLifetime() != null && client.getAttributes().getTxTokenLifetime() > 0) {
199226
log.trace("Override TxToken lifetime with value {} from client: {}", client.getAttributes().getTxTokenLifetime(), client.getClientId());
200227
return client.getAttributes().getTxTokenLifetime();
201228
}
229+
230+
int lifetimeFromScript = externalTxTokenService.getTxTokenLifetimeInSeconds(ExternalScriptContext.of(executionContext));
231+
if (lifetimeFromScript > 0) {
232+
log.trace("Override TxToken lifetime with value {} from script.", lifetimeFromScript);
233+
return lifetimeFromScript;
234+
}
202235
return appConfiguration.getTxTokenLifetime();
203236
}
204237

0 commit comments

Comments
 (0)