in serverless-ui/jwt-stack/src/main/java/com/awssamples/server/Authorizer.java [156:226]
private AuthorizationResponse innerHandleRequest(AuthorizationRequest authorizationRequest, Context context) {
LambdaLogger log = context.getLogger();
String token;
Try<DecodedJWT> decodedJWTTry;
Option<String> unverifiedTokenOption = getUnverifiedToken(authorizationRequest);
Option<String> verifiedTokenOption = getVerifiedToken(authorizationRequest);
if (verifiedTokenOption.isDefined()) {
// Verified by IoT Core already
token = verifiedTokenOption.get();
decodedJWTTry = extractDataWithOnlyIssuedTimeVerification(token);
} else if (unverifiedTokenOption.isDefined()) {
// Unverified token is present, verify it manually
token = unverifiedTokenOption.get();
decodedJWTTry = extractDataWithFullVerification(getTokenVerifier(), token);
} else {
// JWT wasn't found
throw new RuntimeException("Couldn't find a verified or unverified token");
}
if (decodedJWTTry.isFailure()) {
log.log("JWT decoding/validation failure cause: " + decodedJWTTry.getCause().getMessage());
// Decoded JWT probably expired
AuthorizationResponse authorizationResponse = new AuthorizationResponse();
authorizationResponse.isAuthenticated = false;
return authorizationResponse;
}
DecodedJWT decodedJWT = decodedJWTTry.get();
Claim iccidClaim = decodedJWT.getClaim("iccid");
if (iccidClaim.isNull()) {
// No ICCID found
log.log("No ICCID found in claims");
return null;
}
String iccid = iccidClaim.asString();
String clientId = iccid;
String allowedTopic = String.join("/", SharedWithServer.topicPrefix, clientId);
List<Statement> statement = List.of(
Statement.allowIamAction(IotActions.publish(IotResources.topic(allowedTopic))),
Statement.allowIamAction(IotActions.connect(IotResources.clientId(clientId))),
Statement.allowIamAction(IotActions.subscribe(IotResources.topicFilter(allowedTopic))),
Statement.allowIamAction(IotActions.receive(IotResources.topic(allowedTopic))));
PolicyDocument policyDocument = new PolicyDocument();
policyDocument.Version = "2012-10-17";
policyDocument.Statement = statement.asJava();
List<PolicyDocument> policyDocuments = List.of(policyDocument);
AuthorizationResponse authorizationResponse = new AuthorizationResponse();
authorizationResponse.isAuthenticated = true;
authorizationResponse.principalId = clientId;
authorizationResponse.disconnectAfterInSeconds = 86400;
authorizationResponse.refreshAfterInSeconds = 300;
authorizationResponse.policyDocuments = policyDocuments.asJava();
return authorizationResponse;
}