首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用KeyError()重定向到oAuth提供程序时获取‘redirect_to_auth_server:目的’

使用KeyError()重定向到oAuth提供程序时获取‘redirect_to_auth_server:目的’
EN

Stack Overflow用户
提问于 2021-12-22 10:19:35
回答 1查看 81关注 0票数 1

我想要一种使用烧瓶.激活和停用检查的方法

使用@require_login装饰器是一个问题,因为它不能被停用。例如:

代码语言:javascript
复制
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状态,如下所示:

代码语言:javascript
复制
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

我应该能用这样的装潢师:

代码语言:javascript
复制
@app.route('/')
@check_oidc # <= my new decorator
def home():
    return render_template('index.html')

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

代码语言:javascript
复制
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'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-22 10:19:35

解决了。

我查看了@require_login的代码,它如下所示:

代码语言:javascript
复制
if g.oidc_id_token is None:
    return self.redirect_to_auth_server(request.url)

(代码)

所以我没走远..。

我更新了我的装潢师,使之与他们的相匹配

代码语言:javascript
复制
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中被内部使用的函数,所以它不受欢迎。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70447474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档