GitHub user LiamTorrelli added a comment to the discussion: While Accessing 
Embedded Dashboard getting (blocked:other)

`blocked:other` on an embedded Superset dashboard is almost never one missing 
flag. Chrome puts iframe load failures in that bucket when something in the 
header stack says "this parent can't frame me." In our installs it's usually 
one of four things fighting each other.

**1. Dashboard allow-list (easy to miss)**

In the dashboard Embed modal, **Allowed Domains** must include your parent app 
origin exactly (scheme + host + port). Superset checks `Referer`. If the parent 
is `https://app.example.com` and the allow-list has `https://www.example.com`, 
you get a blank iframe and `blocked:other` in DevTools. Fix the dashboard 
metadata before chasing server config.

**2. Three layers that all have to agree**

You need all of these lined up for cross-origin embed:

- `EMBEDDED_SUPERSET = True` in `superset_config.py`
- CORS: `ENABLE_CORS = True` and `CORS_OPTIONS` with your **parent origins** 
listed (if you use cookies/credentials, `"*"` won't cut it — list the real host 
URLs)
- Framing: `TALISMAN_CONFIG` with `content_security_policy` → `frame-ancestors` 
including the parent origin

**3. Reverse proxy / nginx often wins**

Even with Talisman correct, nginx or your ingress can still send 
`X-Frame-Options: DENY` or a stricter CSP. Open DevTools → Network → load the 
`/embedded/<uuid>` request inside the iframe and read **response headers** on 
the Superset side. If `X-Frame-Options` or `Content-Security-Policy` doesn't 
list your parent, that's your blocker — fix it at the proxy, not only in Python 
config.

**4. Helm `configOverrides` = valid Python**

The `SyntaxError` on `CORS_OPTIONS: |` is because that pipe block landed in 
`superset_config.py` as invalid Python. In Helm, `configOverrides` must end up 
as normal assignments, e.g.:

```python
ENABLE_CORS = True
CORS_OPTIONS = {
    "supports_credentials": True,
    "allow_headers": ["*"],
    "resources": [r"/api/v1/security/guest_token/.*", "/*"],
    "origins": ["https://your-parent-app.com";],
}
TALISMAN_ENABLED = True
TALISMAN_CONFIG = {
    "content_security_policy": {
        "frame-ancestors": ["'self'", "https://your-parent-app.com";],
    },
}
```
Swap in your real parent URL. Restart after deploy.

On flask_cors: if ENABLE_CORS = True and the container throws 
ModuleNotFoundError: No module named 'flask_cors', the image may be missing the 
dependency (see [networking 
settings](https://superset.apache.org/docs/configuration/networking-settings/#cors)
 — pre-5.x needed an explicit install). Worth checking your Superset version 
against what the chart ships.

Related upstream thread with no resolution: 
https://github.com/apache/superset/issues/24078

We maintain a checklist of all nine server-side switches (CORS, Talisman, guest 
token, per-dashboard allow-list, and where they interact behind a proxy): 
https://www.drafted.work/blog/superset-embedded-sdk-guest-tokens

GitHub link: 
https://github.com/apache/superset/discussions/32482#discussioncomment-17322040

----
This is an automatically sent email for [email protected].
To unsubscribe, please send an email to: 
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to