AEM Cloud Service - Base64 Decode at Fastly CDN Apply Dispatcher Redirect Rules


Say a third party application writes a cookie to root domain eg. eaem-cokie with employee information json encoded in base64. When an employee visits site published on AEM, Cloud Service CDN and Dispatcher should read the cookie, base64 decode, check existence of employee number and do a pass through (PT) redirect to the employees specific home page....

Demo | Package Install | Github



1) Create maven project...

set JAVA_HOME=C:/Progra~1/Java/jdk-11

mvn -B org.apache.maven.plugins:maven-archetype-plugin:3.2.1:generate -D archetypeGroupId=com.adobe.aem -D archetypeArtifactId=aem-project-archetype
-D archetypeVersion=51 -D aemVersion="cloud" -D appTitle="AEM CDN Base64 Decode" -D appId="eaem-cdn-base-64-decode" -D groupId="apps.experienceaem.sites"
-D frontendModule=none -D includeExamples=n -D includeErrorHandler=n -D includeDispatcherConfig=y


   Optional sample commands to install the project to RDE

   aio aem:rde:install "C:\dev\projects\eaem-extensions\eaem-cloud-service\eaem-cdn-base-64-decode\all\target\eaem-cdn-base-64-decode.all-1.0.0-SNAPSHOT.zip"

   aio aem:rde:install -t env-config "C:\dev\projects\eaem-extensions\eaem-cloud-service\eaem-cdn-base-64-decode\config"

   aio aem:rde:install -t dispatcher-config "C:\dev\projects\eaem-extensions\eaem-cloud-service\eaem-cdn-base-64-decode\dispatcher\src"


2) Create file eaem-cdn-base-64-decode\config\cdn.yaml, add the following code. 

kind: "CDN"
version: "1"
metadata:
    envTypes: [ "rde", "dev" ]
data:
  requestTransformations:
    rules:
      - name: set-employee-info-request-header
        when:
          reqProperty: path
          equals: "/content/eaem-cdn-base-64-decode/us/en/home.html"
        actions:
          #eyJlYWVtLUVtcGxveWVlTnVtYmVyIjoiOTk4ODc3IiwiZWFlbS1kaXNwbGF5TmFtZSI6IkV4cGVyaWVuY2UgQUVNIn0=
          #{"eaem-EmployeeNumber":"998877","eaem-displayName":"Experience AEM"}
          - type: set
            reqHeader: eaem-employee-number
            value: { reqCookie: eaem-cookie, transform: [ "base64decode", {op: 'replace', match: '^.*"eaem-EmployeeNumber":\s*"([0-9]+)".*$', replacement: '\1'} ] }
          - type: set
            reqHeader: eaem-employee-name
            value: { reqCookie: eaem-cookie, transform: [ "base64decode", {op: 'replace', match: '^.*"eaem-displayName":\s*"([^"]+)".*$', replacement: '\1'} ] }            


3) To pass the CDN created headers eaem-employee-number and eaem-employee-name add the following in dispatcher\src\conf.dispatcher.d\clientheaders\clientheaders.any

$include "./default_clientheaders.any" "Eaem-Employee-Number"
"Eaem-Employee-Name"


4) Lets not cache the pages, so add the following code in dispatcher\src\conf.dispatcher.d\dispatcher.any

/rules { /0000 { /glob "*" /type "allow" } /0001 { /glob "/content/eaem-cdn-base-64-decode/*" /type "deny" } }


5) Add PT rewrite rule for checking the existence of Eaem-Employee-Number and redirecting user from general home to employee specific home in dispatcher\src\conf.d\rewrites\rewrite.rules. The following code also adds surrogate header so page is not cached at CDN too

<LocationMatch "^/content/eaem-cdn-base-64-decode"> Header unset Surrogate-Control Header always set Surrogate-Control "no-store, no-cache" </LocationMatch> RewriteCond %{HTTP:Eaem-Employee-Number} !^$ RewriteRule ^/content/eaem-cdn-base-64-decode/us/en/home.html$ /content/eaem-cdn-base-64-decode/us/en/employee-home.html [PT,L]


6) Add a helper WCMUsePojo core\src\main\java\apps\experienceaem\sites\core\models\RequestHeaderHelper.java to read the headers and display for debugging purposes...

package apps.experienceaem.sites.core.models;

import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;

import com.adobe.cq.sightly.WCMUsePojo;

public class RequestHeaderHelper extends WCMUsePojo {
    private Map<String, String> headers;

    @Override
    public void activate() throws Exception {
        HttpServletRequest request = getRequest();
        headers = new LinkedHashMap<>();
        Enumeration<String> headerNames = request.getHeaderNames();
       
        while (headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            headers.put(headerName, request.getHeader(headerName));
        }
    }

    public Map<String, String> getHeaders() {
        return headers;
    }
}

7) Print the headers in ui.apps\src\main\content\jcr_root\apps\eaem-cdn-base-64-decode\components\page\customfooterlibs.html

<sly data-sly-use.headerHelper="apps.experienceaem.sites.core.models.RequestHeaderHelper">
    <ul>
        <li>Employee Number : ${headerHelper.headers['Eaem-Employee-Number'] @ context='text'}</li>
        <li>Employee Name : ${headerHelper.headers['Eaem-Employee-Name'] @ context='text'}</li>
    </ul>

    <div style="margin-top: 50px;">
        All Headers: ${headerHelper.headers @ context='text'}
    </div>
</sly>

No comments:

Post a Comment