flask - 手动验证flask-extended-jwt的访问 token

标签 flask flask-jwt flask-jwt-extended

我有一个 SPA 应用程序,其中包含带有上传文件字段的表单。我有一个 REST API,其端点通过 Flask-extended-jwt JWT 进行保护。为了验证 REST 端点,我使用 @jwt_required。我也想验证上传请求。

由于客户端的原因,我无法添加授权承载 header ,因此我想在提交表单时将访问 token 添加为隐藏字段。

从表单读取 JWT 访问 token 后,手动验证 JWT 访问 token 的最佳方法是什么?

class Upload(Resource):

def post(self):
    #TODO: check for access token
    access_token = None
    if 'access_token' in request.form and request.form['access_token']:
        access_token = request.form['access_token']
    else:
        message = json.dumps({'message': 'Invalid or missing token', 'success': False})
        return Response(response=message, status=401, mimetype='text/plain')

    if access_token:
        #TODO: validate_token(access_token)

谢谢

最佳答案

flask-jwt-extend 的作者在这里。这是一个很好的问题。目前扩展中没有支持的方法来做到这一点,从请求中获取 token 并对其进行解码是紧密耦合在一起的。这很难解耦,因为当完整的解码链运行时会发生很多有条件的事情。例如,仅当请求通过 cookie 发送时才检查 CSRF 值,或者为了黑名单功能而区分访问 token 和刷新 token 。

可以创建一个通用函数,它的签名类似于decode_and_verify_jwt(encoded_token, is_access_token=True, check_csrf=False)。然而,这会使flask_jwt_extended中的其余代码变得复杂,并且对于一般情况来说是一个相当困惑的函数。

我认为在这种情况下,在扩展中添加第四个查找会更容易,因此您可以使用如下内容:

app.config['JWT_TOKEN_LOCATION'] = ['headers', 'forms']
app.config['JWT_FORM_KEY'] = 'access_token'
# Use the rest of the application normally

如果您想在 github 页面上制作票证以便我可以跟踪此内容,我很乐意参与其中。

关于flask - 手动验证flask-extended-jwt的访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51932557/

相关文章:

Flask JWT token /有效载荷 - 返回用户 Json

python - 注销时使 flask-JWT 无效

flask-restful - 在 REST API 中一起使用 flask_login 和 flask-JWT

python - 在 Flask 中将配置文件作为字典读取

python - 如何使用 Flask/Jinja2 将 Python 字典转换为 HTML 模板

python - 在 Flask 中使用 WTForms 验证 GET 参数

flask - "Not enough segments"发送带有 Bearer Token Authorization Header (flask_restful + flask_jwt_extended) 的 GET 消息时

python - 无法设置 Flask_sqlalchemy 的池大小

java - 在 Java 中使用 Python 创建的 JWT Token

python - Flask JWT 扩展缺少 csrf 访问 token