Apache Superset embed Dashboard with Guest Token в DJango

У меня следующая настройка. Я запускаю Django-приложение с Postgres и Apache Superset в одной сети (через docker-compose). Настройка работает отлично; я могу получить доступ к своим данным (Postgres) как из приложения Django, так и из Superset.

Я создал приборную панель в Superset с некоторыми данными и хочу встроить ее на страницу DJnago. Я уже включил общий доступ к приборной панели и могу использовать для этого iFrame. Однако это работает, потому что у меня есть активная вкладка в одном браузере с Superset, в которую я вошел.

Если я перейду в другой браузер, встроенная панель Superset покажет страницу входа в систему. Это логично. Однако как управлять гостевым входом из моего Django-приложения в Superset, чтобы мои пользователи не получали страницу входа в Superset?

Я попробовал следующий код, в котором я использую Superset Guest Token API, мне удалось успешно получить токен, но каждый раз, когда я собираюсь обратиться к следующему URL, я перенаправляюсь на страницу входа Superset с красным сообщением "Access Denied".

http://localhost:8088/superset/dashboard/1/?access_token=TOKEN/?standalone=4 <- 1 - это ID приборной панели

import requests
import json

url = "http://127.0.0.1:8088/api/v1/security/login"
headers = {
  'Content-Type': 'application/json'
}
payload = json.dumps({
  "username": "guest_username",
  "password": "guest_password",
  "refresh": "true",
  "provider": "db"
})
response = requests.request("POST", url, headers=headers, data=payload)
ACCESS_TOKEN = response.json()["access_token"]
#print("ACCESS_TOKEN: " + ACCESS_TOKEN)

url = f"http://127.0.0.1:8088/api/v1/security/csrf_token"
headers = {
  'Content-Type': 'application/json',
  "Authorization": f"Bearer {ACCESS_TOKEN}"
}
response = requests.get(url, headers=headers)
CSRF_TOKEN = response.json()["result"]
#print("CSRF_TOKEN: " + CSRF_TOKEN)
CSRF_COOKIE= response.cookies.get_dict()
#print(CSRF_COOKIE)


url = 'http://127.0.0.1:8088/api/v1/security/guest_token/'
headers = {
  'Content-Type': 'application/json',
  "Authorization": f"Bearer {ACCESS_TOKEN}",
  "X-CSRFToken": f"{CSRF_TOKEN}",
  "Cookie": f"session={CSRF_COOKIE["session"]}"
}
payload = json.dumps({
  "resources": [
    {
      "type": "dashboard",
      "id": "1"
    }
  ],
  "rls": [],
  "user": {
    "first_name": "Guest",
    "last_name": "Account",      
    "username": "guest_account"
  }
})
response = requests.request("POST", url, headers=headers, data=payload, cookies=CSRF_COOKIE)
print(response.json()["token"])
Вернуться на верх