SPA integration troubleshooting
This page provides information about common problems that you may run into while integrating Single-Page Applications (SPAs) with Bloomreach Content. Each section consists of a problem explanation, potential reasons causing the problem, and the solution that may help to solve the problem.
We'll continually update this page as we receive more feedback.
Channel preview in the Experience manager works intermittently in a clustered environment
Reason
The most likely cause for this issue is the session affinity between subsequent calls to CMS cluster nodes. The session affinity relies on a server-id query parameter being passed from Bloomreach Content during the redirect to the SPA. The SPA SDK will retrieve the received parameter and pass it to subsequent requests as a Server-id
header. Bloomreach Content will pick this header and forward the incoming request to the appropriate cluster node.
If the SPA omits the received server-id
parameter, the SPA SDK will not add a Server-id
header in the outbound request to the Delivery API and the request will be dispatched in a round-robin fashion. As a result:
- Calls that hit the cluster node aware of the user's session will succeed with a status 200 and the SPA loading fine in the Experience manager.
- Calls that hit a cluster node that doesn't hold the user's session will fail with a status 401 or 500, the SPA will fail to get a response from the Delivery API.
Solution
Always include the full requested path with all its parameters in the property request.path
of the configuration object that gets passed to the SDK.
"Mixed content" issues and/or warnings in the Experience manager
Your SPA channel in not displayed in the Experience manager and/or your browser is displaying "mixed content" warnings when viewing an SPA channel in the Experience manager. Your Bloomreach Content environment uses HTTPS but your SPA uses HTTP.
Reason
Modern browsers typically block the display of a page or display warning messages if secure content (HTTPS) is mixed with insecure content (HTTP).
This can occur in your development environment when, for example, loading an SPA channel in the Experience manager while Bloomreach Content uses HTTPS and the SPA uses HTTP.
Solution
To avoid mixed content issues while developing your SPA, make sure your SPA uses HTTPS.
HTTPS can be enabled in most frontend frameworks through a single configuration variable, see below for some popular frameworks:
- React
Please use theHTTPS=true
environment variable. See Using HTTPS in development for details. - Angular
Please use the--ssl
flag. See ng serve for details. - Vue CLI
Please use the--https
flag. See vue-cli-service serve for details.
Although it is also possible to enable mixed content in most browsers, this workaround is not recommended.
If, after associating a local SPA using HTTPS with a development project, the Experience manager channel preview still doesn't load or shows an error, you may need to open the SPA in a separate browser tab and explicitly ignore the warning that the connection is not private and may be unsafe. Since you are in full control of the application, it is safe to ignore the warning.
Important
Production instances should always use HTTPS!
Previous versions of a page are not loading in the channel preview when selected in the page's version history in the Experience manager.
Reason
When selecting a specific version from a page's version history in the Experience manager, a version identifier is passed to the frontend application in a request parameter called br_version_uuid
. The frontend application must pass the br_version_uuid
request parameter on to the Delivery API's Pages endpoint so that the correct version of the page is returned. The SPA SDK implements this out of the box.
If you experience this issue, most likely you are using a custom frontend integration (i.e. not using the SPA SDK) and you are not passing on the br_version_uuid
request parameter to the Delivery API. In absence of the version identifier, the Delivery API returns the latest version of the page.
The easiest way to confirm this is the case is by monitoring requests to the frontend application and to the Delivery API while selecting page versions in the Experience manager.
Solution
In your custom frontend integration, always check requests for the presence of the request parameter br_version_uuid
and, if present, pass it on in the subsequent request to the Delivery API's Pages endpoint.
My Web Application Firewall (WAF) blocks requests to the channel preview in the Experience manager because they trigger the Owasp-crs-v030301-id931110-rfi (remote file inclusion) rule.
Reason
The remote file inclusion (RFI) security rule is triggered by the preview iframe of the Experience manager loading the SPA with an endpoint
query parameter containing a full URI, as in the following example:
https://brx-reference-spa-latest.netlify.app/?token=[...]&server-id=[...]&endpoint=https://mycontent.bloomreach.io/delivery/site/v1/channels/mychannel/pages
Because the value of the parameter is a fully qualified URL, it is considered a remote file inclusion (RFI) vulnerability.
The endpoint
query parameter is required for Bloomreach-hosted multi-tenant SPAs that are used as default frontend for newly created channels. A new channel's remoteHostProtection
property is set to false
by default. When opening a channel with remoteHostProtection
set to false
in the Experience manager, the endpoint
query parameter is added to the SPA URL. The SPA SDK will use the URL specified in the 'endpoint' query parameter only if the SPA does not have the endpoint set through an environment variable.
Typically the endpoint
query parameter becomes redundant once a customer deploys their own SPA that uses an environment variable to specify the endpoint.
Solution
The solution is to deploy your own SPA application, specifying the endpoint in an environment variable, and to enable remoteHostProtection
for each of your channels using the Site Management API's channel endpoint.
If you don't have your own SPA yet, you can start with cloning the Reference SPA github project. Make sure to set NEXT_PUBLIC_BRXM_ENDPOINT
in .env
to the appropriate Delivery API endpoint for your environment and channel as explained in the README.
Use the Site development app or the Site Management API's channels endpoint directly to set the remoteHostProtection
property for your channel(s) to true
.
The Experience manager shows the live channel instead of the channel preview or does not update the preview when editing a component
Reason
The most likely cause is the token
header missing from Delivery API requests sent by the SPA.
For the Experience manager to render the channel preview correctly, Delivery API requests from the SPA must include the token
and server-id
headers which are stored in the client configuration object.
The SDK handles this transparently by default but in case of SPA implementations that use the SDK selectively or in a non-standard way, developers may need to take care of the headers explicitly.
Solution
Make sure your SPA always includes the token
and server-id
headers in requests to the Delivery API.
If you are using the SPA SDK selectively on certain pages, you will need to persist the preview related data when navigating between pages that have and those that don't have a SDK instance. See Persist preview data for pages without SDK instance in the SDK documentation for details.
The Experience manager shows an incorrect project name
The project name displayed in the project selector does not match the project displayed in the channel preview.
Reason
The most likely reason is that the channel preview requests by the Experience manager are being cached by the SPA.
When the user switches to a different project, the selected project is updated in the server's session context, and the Experience manager reloads the page, expecting the reloaded page to be driven by a project-specific Delivery API response. However, due to the caching in place, the page reload never hits the server, and the selected project is not reflected correctly on the previewed page.
Solution
Ensure your SPA does not cache any pages in a preview context in the Experience manager. Preview page requests always include a token
request parameter, for example:
https://example-spa.example.com/?token=eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiI5MzBlYzY3NC01NzgyLTQ1MDEtYThmMS02M2VhYmJmOTdhMmQifQ.WTB0636SnSKPbZO0ldUTc8arjFkWj1piU0tVXpGptzhNmwzizX_16YGBW1SvmP4xP34x18v4jBJuOeppsZuGO2RbyhgXKfZ2-_HKl9r7XLNW-FRrUYLijUbY1I2t-wUjnSGzm2hhGoHOk4CP9KrsQEJXKlZ4ijX3wjwXTOsfVZOguhKPGr45n2XUEy5CYor7YDkN_2YCmjoXn3BKyOnkeGlZC_uVJvo0jReB299ICxWth5fOFeNZYcA55CtT66i8H-GIHUHrVoZDikhRcQfkjkgO4NbRanx9Oj1Z3hP025RPycewaXxglSRBSu8FCYYlw6mMF1Tk--k2PndyZg3YvQ&server-id=cms-green-techdoc-development-gloo-one-7958d4588d-7tptn&endpoint=https://example-account.bloomreach.io/delivery/site/v1/channels/example-channel/pages
These requests should never be cached at the SPA level.
In addition, ensure that preview responses don't include any headers triggering the browser to cache those responses.
Channel toolbar is not initialized
Inside the Experience manager, the channel toolbar is not appearing (see screenshot below), but the SPA is fully functioning.
Reason
- The SPA is loading components asynchronously but doesn't call the .sync() function after the page has loaded.
- The Delivery API request in the Experience manager is missing the following headers:
Authorization
andReferer
.
Solution
- If the SPA is loading components asynchronously, call the
.sync()
function after the page has loaded. See https://bloomreach.github.io/spa-sdk/interfaces/index.Page.html for details. - Check in the SPA configuration if the request option doesn’t have a hard coded path, e.g.:
request: { path: '/' }
.
Updated about 1 month ago