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;
    }