python - 将 Okta OIDC 与 Dash 应用程序集成

标签 python flask openid-connect plotly-dash

我正在尝试将 Okta OIDC 身份验证和 Dash 集成到 Flask 应用程序中,以便用户只能在使用我们组织的 Okta SSO 登录后才能查看 Dash 应用程序

试:

from flask import Blueprint, Flask, jsonify, redirect, render_template_string, url_for
from flask_oidc import OpenIDConnect
from okta import UsersClient
import dash

oidc = OpenIDConnect()
okta_client = UsersClient("https://dev-XXXXXX.okta.com",
            "somesecret")

app = Flask(__name__)

app.config.from_mapping(
SECRET_KEY="testkey",
OIDC_CLIENT_SECRETS="/app/appname/client_secrets.json",
OIDC_COOKIE_SECURE= False,
OIDC_CALLBACK_ROUTE="/oidc/callback",
OIDC_SCOPES=["openid", "email", "profile"],
OIDC_ID_TOKEN_COOKIE_NAME="oidc_token",
DEBUG_TB_INTERCEPT_REDIRECTS = False)

oidc.init_app(app)

dash_app.layout = layout.layout
callbacks.register_dash_callbacks(dash_app)
dash_app.run_server(debug=True)

@app.route("/" , methods=["GET"])
@oidc.require_login
def redirect_to_app():
    return redirect(url_for(dash_app.config.requests_pathname_prefix))

给我以下内容:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

该应用程序运行良好,并且可以很好地集成到 Flask 应用程序中。我试过研究,但找不到任何有用的东西。

我也可以通过将它分离成一个蓝图来让它工作,如下所示:
home_blueprint = Blueprint("home", __name__, url_prefix="/")
@home_blueprint.route("/" , methods=["GET"])
@oidc.require_login
def index():
    return redirect(url_for('/dash/'))

但随后直接通过 localhost:5000/dash/ 访问该应用程序未经授权仍然可以。

预先感谢您的帮助。

编辑:
这里是完整的回溯:
Traceback (most recent call last):
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/ddtrace/vendor/wrapt/wrappers.py", line 602, in __call__
    return self._self_wrapper(self.__wrapped__, self._self_instance,
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/ddtrace/contrib/flask/helpers.py", line 20, in wrapper
    return func(pin, wrapped, instance, args, kwargs)
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/ddtrace/contrib/flask/patch.py", line 331, in traced_wsgi_app
    return wrapped(environ, start_response)
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/flask/app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/ddtrace/vendor/wrapt/wrappers.py", line 602, in __call__
    return self._self_wrapper(self.__wrapped__, self._self_instance,
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/ddtrace/contrib/flask/helpers.py", line 20, in wrapper
    return func(pin, wrapped, instance, args, kwargs)
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/ddtrace/contrib/flask/helpers.py", line 29, in wrapper
    return wrapped(*args, **kwargs)
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/flask/app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/flask/app.py", line 1816, in full_dispatch_request
    return self.finalize_request(rv)
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/flask/app.py", line 1833, in finalize_request
    response = self.process_response(response)
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/ddtrace/vendor/wrapt/wrappers.py", line 602, in __call__
    return self._self_wrapper(self.__wrapped__, self._self_instance,
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/ddtrace/contrib/flask/helpers.py", line 20, in wrapper
    return func(pin, wrapped, instance, args, kwargs)
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/ddtrace/contrib/flask/helpers.py", line 29, in wrapper
    return wrapped(*args, **kwargs)
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/flask/app.py", line 2112, in process_response
    response = handler(response)
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/ddtrace/vendor/wrapt/wrappers.py", line 554, in __call__
    return self._self_wrapper(self.__wrapped__, instance,
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/ddtrace/contrib/flask/wrappers.py", line 23, in trace_func
    return wrapped(*args, **kwargs)
  File "/pyenv/versions/3.8.0/envs/customer-feedback-hub/lib/python3.8/site-packages/flask_debugtoolbar/__init__.py", line 202, in process_response
    response_html = response.data.decode(response.charset)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

最佳答案

好的,所以我找到了 this帖子,最终通过替换 login_required 解决了我的问题与 oidc.require_login .原来无效的起始字节与我遇到的另一个错误有关。

app = Flask(__name__)


    app.config.from_mapping(
    SECRET_KEY="testkey",
    OIDC_CLIENT_SECRETS="XXX",
    OIDC_COOKIE_SECURE= False,
    OIDC_CALLBACK_ROUTE="/oidc/callback",
    OIDC_SCOPES=["openid", "email", "profile"],
    OIDC_ID_TOKEN_COOKIE_NAME="oidc_token",
    DEBUG_TB_INTERCEPT_REDIRECTS = False
    )



    oidc.init_app(app)

    dash_app = dash.Dash(__name__,
                    server = app,
                    url_base_pathname='/dash/'
                    )


    for view_func in app.view_functions:
        if view_func.startswith(dash_app.config['url_base_pathname']):
            app.view_functions[view_func] = oidc.require_login(app.view_functions[view_func])


    dash_app.layout = html.Div([intro_div, navbar, exec_dashboard, body])
    register_dash_callbacks(dash_app)

关于python - 将 Okta OIDC 与 Dash 应用程序集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60853537/

相关文章:

python - 将 Flask 中的 URL 还原为端点 + 参数

python - Flask蓝图架构问题

c# - 添加查询字符串参数重定向至 IdP

authentication - AspNetCore.Authentication.JwtBearer 失败,没有 SecurityTokenValidator 可用于带有 .net core RC2 的 token

oauth-2.0 - 自发行 OpenID 提供商与 OpenID 提供商

python - 正向/反向运动学计算 2DOF python

python - 类型错误 : Object of type TypeError is not JSON serializable Python

flask - Psycopg2 和 Flask - 将连接绑定(bind)到 before_request 和 teardown_appcontext

python - Matplotlib——双胞胎 : how to align values of two x-axes in one plot?

python - PyMySQL 连接查询为空