如何确保烧瓶应用程序已在所有路线上获得授权?

Posted

技术标签:

【中文标题】如何确保烧瓶应用程序已在所有路线上获得授权?【英文标题】:How do I make sure a flask app has been authorized on all routes? 【发布时间】:2015-09-30 20:20:36 【问题描述】:

我仍然是 Python 和 Flask 的 n00b。我正在使用烧瓶为 API 创建路由。我正在使用 GitHub-Flask 与 GitHub API 集成。在为每条路由执行代码之前,是否有一种简单且一致的方法来检查当前的访问/请求令牌?希望除了在整个地方复制/粘贴相同的支票;这就是我目前正在做的事情。

@app.route('/resource_1', methods=['GET'])
def get_resource_1():
  if not ACCESS_TOKEN:
    return redirect(url_for('login'))

  # ... do stuff for route

@app.route('/resource_2', methods=['GET'])
def get_resource_2():
  if not ACCESS_TOKEN:
    return redirect(url_for('login'))

  # ... do other stuff for this route

我想有一个更好的方法,但我不知道如何找到它。

【问题讨论】:

我确实找到了这个链接 - flask.pocoo.org/snippets/125 - 但我不确定如何让它适应我的问题。我知道解决方案就在某处。 【参考方案1】:

如果你只想保护某些路由,你可以使用视图装饰器。这看起来像这样:

  from functools import wraps
  from flask import g, request, redirect, url_for

    def login_required(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not ACCESS_TOKEN:
                return redirect(url_for('login'))
            return f(*args, **kwargs)
        return decorated_function

然后你像这样装饰每个资源:

@app.route('/resource_2', methods=['GET'])
@login_required
def get_resource_2():

视图装饰器记录在这里: http://flask.pocoo.org/docs/0.10/patterns/viewdecorators/

如果您想绝对保护每个请求,那么您可以在应用程序或蓝图级别使用 before_request 处理程序:

@app.before_request
def before_request():
    if not ACCESS_TOKEN:
        return redirect(url_for('login'))

【讨论】:

+1 谢谢。不要太贪心,但是在调用登录后是否还有一种方法可以重定向回原始路由? 您可以将原始 url 作为参数传递给请求,也可以将其存储在会话中并在 before_request 处理程序中检查它。这是一种非常常见的模式。为什么不查找一些烧瓶登录包或更好的源代码,为什么不只使用一个! 如果您发现答案是正确的,也将其标记为正确。我最近很贪积分。 arrg.. 这不是一个好的模式。如问题所述,默认情况下需要授权“所有路线”。我不想依赖每个人在未来的每个端点上都放置一个装饰器。我已经坚持了几个小时试图让 app.before_request 工作,但该事件似乎没有显示自定义标题:/ 那么 before_request 方法有什么问题?

以上是关于如何确保烧瓶应用程序已在所有路线上获得授权?的主要内容,如果未能解决你的问题,请参考以下文章

烧瓶中写入数据库的后台任务

在 EC2 上部署的 docker 中使用 flask_oidc 和 nginx 反向代理的烧瓶应用程序在使用 keycloak 进行身份验证后给出未授权错误

python 获取所有烧瓶路线的列表

在 VScode 调试器中更改烧瓶运行端口

在烧瓶路线上分隔多个单词的约定是啥?

从烧瓶启动分离过程