【问题标题】:Is it possible to set jwt to optional during runtime?是否可以在运行时将 jwt 设置为可选?
【发布时间】:2021-07-20 10:10:39
【问题描述】:

我正在使用 Flask-JWT-Extended (https://pypi.org/project/Flask-JWT-Extended/) 来保护我的烧瓶应用程序。 jwt_required 装饰器将 optional 作为参数。尽管如此,我的烧瓶应用程序是在一个类中创建的,我无法在实例化该类之前设置 optional 参数。 这是我尝试过的:

from flask import Flask, jsonify
from flask_jwt_extended import jwt_required, JWTManager

jwt_optional = False


class Node:

    def __init__(self, name: str, key: str, jwt_opt: bool = False):
        self.app = Flask(name)
        self.app.config['SECRET_KEY'] = key
        global jwt_optional
        jwt_optional = jwt_opt
        self.app.add_url_rule(rule='/get_token',
                              endpoint='get_token',
                              view_func=self.get_token,
                              methods=['GET'])

    @jwt_required(optional=jwt_optional)
    def get_token(self):
        print('Token success')
        return jsonify({'msg': 'Token success'})


if __name__ == '__main__':
    node = Node('Test Node', key='unsafe', jwt_opt=True)
    app = node.app
    app.config['TESTING'] = True
    jwt = JWTManager(app=app)
    test_app = app.test_client()
    response = test_app.get('/get_token')
    print(response.json)

我想很明显它不起作用,因为在我更改全局变量之前对装饰器进行了评估。

是否可以在运行时将令牌设为可选?

【问题讨论】:

    标签: flask jwt flask-jwt-extended


    【解决方案1】:

    我还必须处理可选 JWT 的情况。我最终做的是将装饰器放在通用函数之上,然后在路由本身期间简单地调用该函数 - 或者跳过它,以防 jwt_optional 为 True

    jwt_optional = True
    
    @jwt_required()
    def jwt_protection():
       pass
    
    # ...
    
    class Node:
      # ...
      def get_token(self):
        if jwt_optional is False:
            jwt_protection()
        print('Token success')
        return jsonify({'msg': 'Token success'})
    

    我认为这是一个简单的解决方法,它也可能对您的情况有所帮助

    【讨论】:

    • 不需要,直接使用 verify_jwt_in_request() flask-jwt-extended.readthedocs.io/en/stable/api/…。这就是 jwt_required() 装饰器调用的全部内容。
    • 谢谢!为flask_jwt推荐的方法是什么?如果我使用 _jwt_required 函数执行此操作,我会收到“访问受保护成员警告”,因此我继续使用装饰器。我发现这对 flask_jwt_extended 来说效果很好。
    • 你说得对,这行得通。尽管如此,我认为我仍然可以利用装饰器的“美”,而不是更改需要令牌的每个功能。由于 jwt 包已经使用了像 JWT_SECRET_KEY 这样的全局应用程序设置,因此在应用程序配置中使用 JWT_OPTIONAL 值可能会很有用。我想我可能会错过类似的东西,但这将是对开发人员的功能要求。
    • @c8999c3f964f64 从烧瓶 jwt 迁移 :) 它已被废弃多年
    • @Sebastian 再次没有理由将其放入flask-jwt-extended。只需使用一些全局配置,在烧瓶配置中说些什么来切换该标志,然后调用 verify_jwt_in_request(optional=)
    猜你喜欢
    • 2023-01-20
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2011-01-15
    • 2010-10-09
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    相关资源
    最近更新 更多