Expand my Community achievements bar.

Cookies consent opt out utils not working

Avatar

Level 4

@arunpatidar you may be able to help as i see you recently posted a link to the opt out service on this forum question.

I want to use the opt out service in an AEM Sightly template to do cookie consent management.

I am following the documentation linked to above, but i seem to be missing something.

In my local AEM instance, my service is configured OK as i can see at http://localhost:4502/system/console/status-Configurations

 

PID = com.adobe.granite.optout.impl.OptOutServiceImpl
  BundleLocation = Unbound
  optout.cookies = [cq-opt-out, omniture_optout]
  optout.whitelist.cookies = [cq-show-clientcontext, cq-scrollpos, cq-sk-collapsed, login-token, ys-cq-siteadmin-tree, ys-cq-damadmin-tree, ys-cq-collabadmin-tree, ys-cq-miscadmin-tree, ys-cq-tagadmin, ys-cq-cf-clipboard, ys-cq-cf-tabpanel, SessionPersistence, wcmmode, CommercePersistence, cq-authoring-mode, SH_CAMPAIGN]
  service.pid = com.adobe.granite.optout.impl.OptOutServiceImpl

 

and I am able to include and call browser script methods from Granite.OptOutUtil in a Sightly template in the following way,

 

<sly data-sly-test="${wcmmode.disabled}">
    <sly data-sly-call="${clientlib.all @ categories='granite.utils'}"/>
</sly>

<script>
  (function logCookies() {
    console.info('whitelisted cookie names? ')
    console.table(Granite.OptOutUtil.getWhitelistCookieNames()) // outputs an empty array
    console.info('optout cookie names? ')
    console.table(Granite.OptOutUtil.getCookieNames()) // outputs an empty array
  })()
</script>

 

but the method calls return empty arrays 

Debugging the client-side code in a browser, the Granite.OptOutUtil object is initialised with a config option, that is undefined when the following line executes.  What am I missing?

 

Granite.OptOutUtil.init(window.GraniteOptOutConfig);  // window.GraniteOptOutConfig is undefined

 

10 Replies

Avatar

Community Advisor

Hi,

The service PID should be 

com.adobe.granite.optout


Arun Patidar

Avatar

Level 4

Thanks for the reply @arunpatidar and for pointing out what the PID should be.  Are you basing your reply on a working example - can you share that (I can't find an example of the opt out service being used by the we retail project)?  Or is your suggestion based on the documentation, where I see it says, 

"...The following table desribes [sic] the properties that you need for either method. For an OSGi configuration, the service PID is com.adobe.granite.optout."
I'm a bit confused about this point about the PID, when I run up AEM 6.4 with no custom code added to it, there is already an osgi configuration entry in place for 

service.pid="com.adobe.granite.optout.impl.OptOutServiceImpl"

If i provide a configuration entry for service.pid="com.adobe.granite.optout" then my local AEM instance ends up with 2 similar entries (presumably my entry plus the out-of-the-box one):

PID = com.adobe.granite.optout
  BundleLocation = Unbound
  optout.cookies = [cq-opt-out, omniture_optout]
  optout.whitelist.cookies = [cq-show-clientcontext, cq-scrollpos, cq-sk-collapsed, login-token, ys-cq-siteadmin-tree, ys-cq-damadmin-tree, ys-cq-collabadmin-tree, ys-cq-miscadmin-tree, ys-cq-tagadmin, ys-cq-cf-clipboard, ys-cq-cf-tabpanel, SessionPersistence, wcmmode, CommercePersistence, cq-authoring-mode, SH_CAMPAIGN]
  service.pid = com.adobe.granite.optout

PID = com.adobe.granite.optout.impl.OptOutServiceImpl
  BundleLocation = Unbound
  optout.cookies = [cq-opt-out, omniture_optout]
  optout.whitelist.cookies = [cq-show-clientcontext, cq-scrollpos, cq-sk-collapsed, login-token, ys-cq-siteadmin-tree, ys-cq-damadmin-tree, ys-cq-collabadmin-tree, ys-cq-miscadmin-tree, ys-cq-tagadmin, ys-cq-cf-clipboard, ys-cq-cf-tabpanel, SessionPersistence, wcmmode, CommercePersistence, cq-authoring-mode]
  service.pid = com.adobe.granite.optout.impl.OptOutServiceImpl

Either way, i still get empty arrays in response to client side calls like,

Granite.OptOutUtil.getCookieNames()

and when http://localhost:4502/etc.clientlibs/clientlibs/granite/utils.js is initialised, window.GraniteOptOutConfig is still 'undefined' 
How does the config get "read" and set on the client library utils.js?  

Avatar

Community Advisor

Hi,

I did not implemented this, I was just refering the documents. BTW ths osgi configuration was correct with 

service.pid = com.adobe.granite.optout.impl.OptOutServiceImpl

Can you check this configuration at http://localhost:4504/libs/granite/security/optout/configuration.json

Please check https://rmengji.wordpress.com/2015/02/26/aem-do-not-track-cookie-setting-aem-granite-opt-out-service...

You need to set Header as well and you can directly used methods like 

Granite.OptOutUtil.getCookieNames()

 I don't think so that you need to set  

Granite.OptOutUtil.init(window.GraniteOptOutConfig);

 



Arun Patidar

Avatar

Level 4

Thanks for the help @arunpatidar.

Some replies from me:

 


@arunpatidar wrote:

Hi,

I did not implemented this, I was just refering the documents.


Ok thanks for confirming.

 

 

Can you check this configuration at http://localhost:4504/libs/granite/security/optout/configuration.json

My localhost:4502 author instance returns valid json (as you'd expect, given this comes as standard out of the box).

{"cookienames": ["omniture_optout","cq-opt-out"],"headers": {},"whitelistcookienames": ["ys-cq-siteadmin-tree","cq-sk-collapsed","ys-cq-cf-tabpanel","cq-show-clientcontext", // ...etc

 

 

Please check https://rmengji.wordpress.com/2015/02/26/aem-do-not-track-cookie-setting-aem-granite-opt-out-service...

You need to set Header as well and you can directly used methods like 

Granite.OptOutUtil.getCookieNames()

 Ok I will add the X-Do-Not-Track header (if that's what you meant?) but i'm not sure why this would make this feature work?  As you can see from my comments above, I am already calling methods directly like getCookieNames(), they just return empty arrays - despite the configuration.  This is the root of my problem.

 

 


 I don't think so that you need to set  

Granite.OptOutUtil.init(window.GraniteOptOutConfig);

 


I don't "set" or call this function, it is run by the browser.   I only mention it here to explain why client-side methods like getCookieNames return empty arrays (because the window.GraniteOptOutConfig object that provides this data is undefined when the init() function runs (see http://localhost:4502/crx/de/index.jsp#/libs/clientlibs/granite/utils/source/init.js)).

 

 


 

Avatar

Community Advisor

Hi,

I checked the code but did not find where the values are set

 

(function(d) {
    return function() {
        var d = {}
          , w = []
          , y = [];
        d.init = function(d) {
            d ? (w = d.cookieNames || [],
            y = d.whitelistCookieNames || []) : (w = [],
            y = [])
        }
        ;
        d.getCookieNames = function() {
            return w
        }
        ;
        d.getWhitelistCookieNames = function() {
            return y
        }
        ;
        d.isOptedOut = function() {
            for (var q = document.cookie.split(";"), r = 0; r < q.length; r++) {
                var y = q[r].split("\x3d")[0];
                y = String.prototype.trim ? y.trim() : y.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "");
                if (0 <= d.getCookieNames().indexOf(y))
                    return !0
            }
            return !1
        }
        ;
        d.maySetCookie = function(q) {
            return !(d.isOptedOut() && -1 === d.getWhitelistCookieNames().indexOf(q))
        }
        ;
        return d
    }()
});
Granite.OptOutUtil.init(window.GraniteOptOutConfig);


Arun Patidar

Avatar

Level 4

Hi @arunpatidar 

Where is JS you've pasted in above taken from?

 

This granite.utils client library is made up of the scripts specified in /libs/clientlibs/granite/utils/js.txt, i.e.

#base=source

Sling.js
Util.js
HTTP.js
I18n.js
TouchIndicator.js
OptOutUtil.js

init.js

If you look at /libs/clientlibs/granite/utils/source/OptOutUtil.js you'll see code (and its inline documentation) like the following (line 63 onwards)

 /**
         * Initializes this tool with an opt-out configuration.
         *
         * The following options are supported:
         * <ul>
         *     <li>cookieNames: an array of cookie names representing opt-out cookies. Defaults to empty.</li>
         *     <li>whitelistCookieNames: an array of cookies representing white-listed cookies. Defaults to empty.</li>
         * </ul>
         *
         * @param {Object} config The opt-out configuration.
         *
         * @example
         * {
         *     "cookieNames": ["omniture_optout","cq-opt-out"],
         *     "whitelistCookieNames": ["someAppCookie", "anotherImportantAppCookie"]
         * }
         */
        self.init = function(config) {
            if (config) {
                optOutCookieNames = config.cookieNames || [];
                whitelistedCookieNames = config.whitelistCookieNames || [];
            } else {
                optOutCookieNames = [];
                whitelistedCookieNames = [];
            }
        };

 

 

 

Avatar

Level 4

@VaniBhemarasetty  are you familiar with the AEM Sites cookie opt out feature?
I can't get the client side library to work, following the Adobe documentation.

I'm sure i'm missing something simple - see the comments above on this forum question. 

Avatar

Level 4

Also, I tried setting the header as per the other web page you referenced and applied changes to the "we retail" example project.  Unfortunately with the same outcome

I must be missing some configuration or additional settings...

 

My local osgi output service now configured as follows,

http://localhost:4502/libs/granite/security/optout/configuration.json

{
  "cookienames": [
    "omniture_optout",
    "cq-opt-out"
  ],
  "headers": {
    "X-Do-Not-Track": "1",
    "DNT": "1"
  },
  "whitelistcookienames": [
    "ys-cq-siteadmin-tree",
    "cq-sk-collapsed",
    "ys-cq-cf-tabpanel",
    "cq-show-clientcontext",
    "CommercePersistence",
    "wcmmode",
    "ys-cq-damadmin-tree",
    "login-token",
    "ys-cq-collabadmin-tree",
    "ys-cq-miscadmin-tree",
    "ys-cq-tagadmin",
    "cq-authoring-mode",
    "cq-scrollpos",
    "ys-cq-cf-clipboard",
    "SessionPersistence"
  ]
}

 

Avatar

Level 1

Hey @dorianhallward,

 

I am also having the same issue where I've created a custom OSGi configuration inside the repository. Every time I use the JS API to fetch the cookies that I have opted out from, it still outputs an empty array. I have tried passing the configuration cookies in the Granite.OptOutUtil class but it did not work (it only worked in my local environment). 

 

Did you ever solve this issue?

Avatar

Level 1

Same issue here, added custom OSGi config with optout.cookies, optout.headers and optout.whitelist.cookies. Yet still the same problem, when using the Granite.OptOutUtil to fetch the cookies, the arrays are always empty.

Have you found any fix for that @dorianhallward @user02128