【问题标题】:Getting 'KeyError: destination' when making redirection to oAuth provider using redirect_to_auth_server()使用 redirect_to_auth_server() 重定向到 oAuth 提供程序时获取“KeyError:destination”
【发布时间】:2022-01-23 14:02:05
【问题描述】:

我想要一种使用 flask-oidc 激活和停用 OIDC 检查的方法。
使用 @require_login 装饰器是个问题,因为它不能被停用。例如:

g_use_oidc = True # <= A global boolean to activate or deactivate OIDC at application level

@app.route('/') # <= Flask routing
@require_login # <= Flask-OIDC making redirection to oAuth provider
def home():
    return render_template('index.html')

当我被重定向到我的 oAUth 提供商时,这与 OIDC 配合得很好。但现在我希望将 g_use_oidc 设置为 False,并希望 @require_login 停止重定向呼叫。


为了实现这一点,我创建了一个装饰器来检查g_use_oidc 状态,如下所示:

def check_oidc_test(func):

    @wraps()
    def inner():
        if not use_oidc or oidc.user_loggedin == True:
            func()
        elif use_oidc and oidc.user_loggedin == False:
            return oidc.redirect_to_auth_server(None, request.values) # <= Redirection to OIDC provider as shown in the doc
    return inner

我应该可以像这样使用装饰器:

@app.route('/')
@check_oidc # <= my new decorator
def home():
    return render_template('index.html')

不幸的是,我从 OIDC 获得了这个堆栈跟踪:

Traceback (most recent call last):
  File "x.local/lib/python3.8/site-packages/flask/app.py", line 2088, in __call__
    return self.wsgi_app(environ, start_response)
  File "x.local/lib/python3.8/site-packages/flask/app.py", line 2073, in wsgi_app
    response = self.handle_exception(e)
  File "x.local/lib/python3.8/site-packages/flask/app.py", line 2070, in wsgi_app
    response = self.full_dispatch_request()
  File "x.local/lib/python3.8/site-packages/flask/app.py", line 1515, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "x.local/lib/python3.8/site-packages/flask/app.py", line 1513, in full_dispatch_request
    rv = self.dispatch_request()
  File "x.local/lib/python3.8/site-packages/flask/app.py", line 1499, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
  File "x.local/lib/python3.8/site-packages/flask_oidc/__init__.py", line 657, in _oidc_callback
    plainreturn, data = self._process_callback('destination')
  File "x.local/lib/python3.8/site-packages/flask_oidc/__init__.py", line 707, in _process_callback
    response = self.extra_data_serializer.loads(state[statefield])
KeyError: 'destination'

【问题讨论】:

    标签: python flask openid-connect flask-oidc


    【解决方案1】:

    解决了。

    我查看了@require_login 的代码,看起来像这样:

    if g.oidc_id_token is None:
        return self.redirect_to_auth_server(request.url)
    

    (require_login_code)

    所以我没走多远……

    我更新了我的装饰器以匹配他们的

    def check_oidc(view_func):
        @wraps(view_func)
        def decorated(*args, **kwargs):
            if g_use_oidc is True and oidc.user_loggedin == False:
                return oidc.redirect_to_auth_server(request.url)
            return view_func(*args, **kwargs)
        return decorated
    

    它使用 oidc.redirect_to_auth_server,从 1.0.0 开始已弃用。但它是 @require_login 内部使用的函数,所以它没有被弃用。

    【讨论】:

      猜你喜欢
      • 2011-08-12
      • 1970-01-01
      • 2012-01-09
      • 2021-11-21
      • 1970-01-01
      • 2018-08-08
      • 2018-11-03
      • 2013-07-30
      • 2019-09-20
      相关资源
      最近更新 更多