python - 启用 OAuth 身份验证时出现 Apache Superset TypeError
问题描述
我正在尝试在 Superset 1.0.1 上使用 GitHub api 配置 OAuth 身份验证。按照文档,我在superset_config.py
from flask_appbuilder.security.manager import AUTH_OAUTH
import logging
from custom_sso_security_manager import CustomSsoSecurityManager
CUSTOM_SECURITY_MANAGER = CustomSsoSecurityManager
AUTH_TYPE = AUTH_OAUTH
OAUTH_PROVIDERS = {
"name": "github",
"icon": "fa-github",
"remote_app": {
"client_id": "<my github client_id>" ,
"client_secret": "<my github client secret>",
"api_base_url": "https://github.com",
"request_token_url": "https://github.com/login/oauth/request_token",
"access_token_url": "https://github.com/login/oauth/access_token",
"authorize_url": "https://github.com/login/oauth/authorize",
},
}
# Will allow user self registration, allowing to create Flask users from Authorized User
AUTH_USER_REGISTRATION = True
# The default user self registration role
AUTH_USER_REGISTRATION_ROLE = "Public"
并创建了文件custom_sso_security_manager.py
from superset.security import SupersetSecurityManager
class CustomSsoSecurityManager(SupersetSecurityManager):
def oauth_user_info(self, provider, response=None):
logging.debug("Oauth2 provider: {0}.".format(provider))
if provider == 'github':
me = self.appbuilder.sm.oauth_remotes[provider].get('userinfo').data
logging.debug("user_data: {0}".format(me))
return { 'email': me['email'], 'username': me['email'], 'first_name': me['nickname'], 'last_name': me['nickname'] }
当我使用以下命令启动超集时
superset run -h $(hostname) -p 8088 --with-threads --reload --debugger
($(hostname)
为了提供从浏览器访问 gui 的参数,因为我在远程 AWS EC2 实例上部署超集)
我收到以下错误
Traceback (most recent call last):
File "/opt/superset/venv/lib/python3.8/site-packages/superset/app.py", line 62, in create_app
app_initializer.init_app()
File "/opt/superset/venv/lib/python3.8/site-packages/superset/app.py", line 551, in init_app
self.init_app_in_ctx()
File "/opt/superset/venv/lib/python3.8/site-packages/superset/app.py", line 520, in init_app_in_ctx
self.configure_fab()
File "/opt/superset/venv/lib/python3.8/site-packages/superset/app.py", line 591, in configure_fab
appbuilder.init_app(self.flask_app, db.session)
File "/opt/superset/venv/lib/python3.8/site-packages/flask_appbuilder/base.py", line 202, in init_app
self.sm = self.security_manager_class(self)
File "/opt/superset/venv/lib/python3.8/site-packages/flask_appbuilder/security/sqla/manager.py", line 51, in __init__
super(SecurityManager, self).__init__(appbuilder)
File "/opt/superset/venv/lib/python3.8/site-packages/flask_appbuilder/security/manager.py", line 261, in __init__
provider_name = _provider["name"]
TypeError: string indices must be integers
Traceback (most recent call last):
File "/opt/superset/venv/bin/superset", line 33, in <module>
sys.exit(load_entry_point('apache-superset==1.0.1', 'console_scripts', 'superset')())
File "/opt/superset/venv/lib/python3.8/site-packages/click/core.py", line 829, in __call__
return self.main(*args, **kwargs)
File "/opt/superset/venv/lib/python3.8/site-packages/flask/cli.py", line 586, in main
return super(FlaskGroup, self).main(*args, **kwargs)
File "/opt/superset/venv/lib/python3.8/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/opt/superset/venv/lib/python3.8/site-packages/click/core.py", line 1256, in invoke
Command.invoke(self, ctx)
File "/opt/superset/venv/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/opt/superset/venv/lib/python3.8/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/opt/superset/venv/lib/python3.8/site-packages/click/decorators.py", line 21, in new_func
return f(get_current_context(), *args, **kwargs)
File "/opt/superset/venv/lib/python3.8/site-packages/flask/cli.py", line 425, in decorator
with __ctx.ensure_object(ScriptInfo).load_app().app_context():
File "/opt/superset/venv/lib/python3.8/site-packages/flask/cli.py", line 381, in load_app
app = call_factory(self, self.create_app)
File "/opt/superset/venv/lib/python3.8/site-packages/flask/cli.py", line 119, in call_factory
return app_factory()
File "/opt/superset/venv/lib/python3.8/site-packages/superset/app.py", line 69, in create_app
raise ex
File "/opt/superset/venv/lib/python3.8/site-packages/superset/app.py", line 62, in create_app
app_initializer.init_app()
File "/opt/superset/venv/lib/python3.8/site-packages/superset/app.py", line 551, in init_app
self.init_app_in_ctx()
File "/opt/superset/venv/lib/python3.8/site-packages/superset/app.py", line 520, in init_app_in_ctx
self.configure_fab()
File "/opt/superset/venv/lib/python3.8/site-packages/superset/app.py", line 591, in configure_fab
appbuilder.init_app(self.flask_app, db.session)
File "/opt/superset/venv/lib/python3.8/site-packages/flask_appbuilder/base.py", line 202, in init_app
self.sm = self.security_manager_class(self)
File "/opt/superset/venv/lib/python3.8/site-packages/flask_appbuilder/security/sqla/manager.py", line 51, in __init__
super(SecurityManager, self).__init__(appbuilder)
File "/opt/superset/venv/lib/python3.8/site-packages/flask_appbuilder/security/manager.py", line 261, in __init__
provider_name = _provider["name"]
TypeError: string indices must be integers
会是什么呢 ?我的直觉是我使用了错误的 authlib 包版本或类似的东西。我的python包环境如下
Package Version
---------------------- -----------
aiohttp 3.7.4.post0
alembic 1.5.8
amqp 2.6.1
apache-superset 1.0.1
apispec 3.3.2
async-timeout 3.0.1
attrs 20.3.0
Authlib 0.15.3
Babel 2.9.0
backoff 1.10.0
billiard 3.6.3.0
bleach 3.3.0
Brotli 1.0.9
cachelib 0.1.1
celery 4.4.7
certifi 2020.12.5
cffi 1.14.5
chardet 4.0.0
click 7.1.2
colorama 0.4.4
contextlib2 0.6.0.post1
convertdate 2.3.2
cron-descriptor 1.2.24
croniter 1.0.10
cryptography 3.4.7
decorator 4.4.2
defusedxml 0.7.1
dnspython 2.1.0
email-validator 1.1.2
Flask 1.1.2
Flask-AppBuilder 3.2.1
Flask-Babel 1.0.0
Flask-Caching 1.10.1
Flask-Compress 1.9.0
Flask-JWT-Extended 3.25.1
Flask-Login 0.4.1
Flask-Migrate 2.7.0
Flask-OpenID 1.2.5
Flask-SQLAlchemy 2.5.1
flask-talisman 0.7.0
Flask-WTF 0.14.3
geographiclib 1.50
geopy 2.1.0
greenlet 1.0.0
gunicorn 20.0.4
holidays 0.10.3
humanize 3.3.0
idna 2.10
isodate 0.6.0
itsdangerous 1.1.0
Jinja2 2.11.3
jsonschema 3.2.0
kombu 4.6.11
korean-lunar-calendar 0.2.1
Mako 1.1.4
Markdown 3.3.4
MarkupSafe 1.1.1
marshmallow 3.10.0
marshmallow-enum 1.5.1
marshmallow-sqlalchemy 0.23.1
msgpack 1.0.2
multidict 5.1.0
numpy 1.20.1
packaging 20.9
pandas 1.1.5
parsedatetime 2.6
pathlib2 2.3.5
pgsanity 0.2.9
pip 21.0.1
polyline 1.4.0
prison 0.1.3
py 1.10.0
pyarrow 1.0.1
pycparser 2.20
PyJWT 1.7.1
PyMeeus 0.5.11
PyMySQL 1.0.2
pyparsing 2.4.7
pyrsistent 0.17.3
pysqlite3 0.4.5
python-dateutil 2.8.1
python-dotenv 0.15.0
python-editor 1.0.4
python-geohash 0.8.5
python3-openid 3.2.0
pytz 2021.1
PyYAML 5.4.1
redis 3.5.3
requests 2.25.1
retry 0.9.2
selenium 3.141.0
setuptools 49.2.1
simplejson 3.17.2
six 1.15.0
slackclient 2.5.0
SQLAlchemy 1.3.23
SQLAlchemy-Utils 0.36.8
sqlparse 0.3.0
typing-extensions 3.7.4.3
urllib3 1.26.4
vine 1.3.0
webencodings 0.5.1
Werkzeug 1.0.1
WTForms 2.3.3
WTForms-JSON 0.3.3
yarl 1.6.3
我在 CentOS 7.9 上使用 Python 3.8.7
在此先感谢您的帮助
解决方案
也许我不应该这么早发布这个问题,因为这是一个非常简单的错误......
OAUTH_PROVIDERS
变量应该是一个数组!
OAUTH_PROVIDERS = [{
"name": "github",
"icon": "fa-github",
"remote_app": {
"client_id": "<my github client_id>" ,
"client_secret": "<my github client secret>",
"api_base_url": "https://github.com",
"request_token_url": "https://github.com/login/oauth/request_token",
"access_token_url": "https://github.com/login/oauth/access_token",
"authorize_url": "https://github.com/login/oauth/authorize",
},
}
]
现在超集正确启动。虽然我在 github 登录方面还有其他一些问题,但我认为这应该是另一个问题。
PS我考虑过删除这个问题,因为这只是一个错字,我应该(再次)使用RTFM,但我会留下它,也许它可能对其他人有用。
推荐阅读
- python - 如何在 Python 中将 CTRL-P 发送到 Web 浏览器
- c# - 如何使用 iText 7 设置卢布符号?
- jenkins - 从上游 Jenkins 管道作业调用多个下游作业
- javascript - 用jquery对html表进行排序
- gis - 如何从geoserver请求WFS服务并将geojson数据加载为铯中的一层?
- c# - 如何使用 Automapper 展平 C# 中重复使用的子对象
- python - 是否可以将双矩阵列转换为列表或配对?
- apt - 源编译或使用apt有什么区别?
- mysql - 获取从现在起 3 天后到期的行
- php - MYSQL 只选择列的一部分