Serge Huber created UNOMI-1019:
----------------------------------

             Summary: Make unomi-tracker compatible with both V2/V3 and V4
                 Key: UNOMI-1019
                 URL: https://issues.apache.org/jira/browse/UNOMI-1019
             Project: Apache Unomi
          Issue Type: Improvement
          Components: unomi-tracker
    Affects Versions: unomi-tracker-1.6.0
            Reporter: Serge Huber
            Assignee: Serge Huber
             Fix For: unomi-tracker-1.6.0


h3. Summary

In 4.0, context.json and eventcollector need a tenant public API key in the 
X-Unomi-Api-Key header, unless the single-tenant compatibility mode is on. The 
web tracker (apache-unomi-tracker) cannot send this header. So it only works 
with Unomi 2, Unomi 3, or Unomi 4 in compatibility mode, where every request 
goes to the default tenant. With a multi-tenant server it gets 401 answers.

The manual already tells readers to use the NPM tracker to send the key 
(web-tracker.adoc, tutorial.adoc), but the tracker does not support it yet. The 
tracker bundled with Unomi (extensions/web-tracker) repackages the NPM tracker, 
so it has the same limit.

The goal of this ticket is that the same tracker works with Unomi 2, Unomi 3 
and Unomi 4 multi-tenant, chosen by configuration.

h3. Decided approach
* A new optional setting, wemInitConfig.apiKey. When it is set, the tracker 
sends it as X-Unomi-Api-Key on context.json and eventcollector requests. When 
it is not set, requests are exactly as today.
* No tenant ID setting. On public endpoints the server finds the tenant from 
the public key alone. X-Unomi-Tenant-Id is only used on private endpoints.
* Only the public key goes in the tracker. The page configuration is visible to 
every visitor, so the documentation must say never to use a private key there.
* Older servers keep working when a key is set. Their CORS settings allow any 
request header, so the preflight passes and the header is ignored. In 
compatibility mode the 4.0 server ignores the key on public endpoints.

h3. Known cost
* The custom header makes the browser send a CORS preflight. The tracker uses 
text/plain today to avoid one.
* Neither 2.x nor 4.0 sets Access-Control-Max-Age, so browsers keep the 
preflight result only briefly and send one before almost every request. Setting 
a max age on the public endpoints could be a separate server ticket.
* A key can be combined with sendCredentials: false (UNOMI-1005) for sites that 
do not need the visitor cookie.

h3. Follow-ups in apache/unomi
* Update extensions/web-tracker to the tracker release that includes this, and 
let its page configuration pass apiKey.
* Update web-tracker.adoc, tutorial.adoc and the JavaScript tracker guide so 
that they describe the apiKey setting.

h3. How to test

Automated tests in the tracker:
* No header is sent when apiKey is not set or is empty.
* The header is sent with the configured value when apiKey is set.
* The other request headers are unchanged.

Manual checks:
* A page with apiKey loads context.json from another origin against a 4.0 
multi-tenant server, and the events go to that tenant.
* The same page works against a 2.x server and against 4.0 in compatibility 
mode.
* A page without apiKey gets 401 from a 4.0 multi-tenant server and works in 
compatibility mode.




--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to