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"])