首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Connexion中验证签名-请求前消息-主体验证

在Connexion中验证签名-请求前消息-主体验证
EN

Stack Overflow用户
提问于 2022-03-03 11:35:30
回答 1查看 386关注 0票数 0

目前,我有一个使用Connexion并接收OpenAPI规范的工作API:

代码语言:javascript
运行
复制
connexion_app.add_api(
    "openapi.yaml",
    options={"swagger_ui": False},
    validate_responses=True,
    strict_validation=True,  # Changing this also didn't help
)

响应按以下顺序进行验证:

parameters

  • Validate message-signature

  • Handle

  • 检查API-Key是否有效,

  • 验证请求主体是否包含所有必要的

  • 请求,并发送响应

API-Key的验证是通过OpenAPI规范完成的:

代码语言:javascript
运行
复制
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: API-Key
      x-apikeyInfoFunc: server.security.check_api_key
security:
  - apiKeyAuth: []

验证也是通过OpenAPI规范完成的。

在端点中验证签名:

代码语言:javascript
运行
复制
if not verify_signature(kwargs):
    abort(401, "Signature could not be verified")

verify_signature基本上是这样的:

代码语言:javascript
运行
复制
def verify_signature(request) -> bool:
    """Calculate the signature using the header and data."""
    signature = re.findall(r'"([A-Za-z0-9+/=]+)"', connexion.request.headers.get("Message-Signature", ""))
    created = re.findall(r"created=(\d+)", connexion.request.headers.get("Message-Signature", ""))
    if len(signature) == 0:
        abort(401, "No valid Signature found.")
    if len(created) == 0:
        abort(401, "No valid created timestamp found.")

    signature = signature[0]
    created = int(created[0])
    method, path, host, api_key, content_type = _get_attributes_from_request()
    message = create_signature_message(request["body"], created, method, path, host, api_key, content_type)
    recreated_signature = _encode_message(message)
    return recreated_signature == str(signature)

为了安全起见,我想交换2和3:

如果请求主体包含所有必要的valid

  • Validate message-signature

  • Validate请求,则检查API-Key是否为valid

  • Validate message-signature

  • Validate,并发送响应

问题是,Connexion在到达执行Python代码(如verify_signature )的端点之前验证了主体。

我尝试在我的OpenAPI.yaml中添加以下内容:

代码语言:javascript
运行
复制
    signatureAuth:
      type: http
      scheme: basic
      x-basicInfoFunc: server.security.verify_signature
security:
  - apiKeyAuth: []
    signatureAuth: []

但我认为这是错误的方法,因为我认为这只是一种简单的验证方法,我得到了以下错误消息:No authorization token provided

关于我的问题:

是否有一种方法可以在Connexion验证主体之前执行接收整个请求的函数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-20 12:28:12

是的,您可以使用Connexion before_request注释,以便在验证主体之前在新请求上运行一个函数。下面是一个记录标题和内容的示例:

代码语言:javascript
运行
复制
import connexion
import logging
from flask import request

logger = logging.getLogger(__name__)
conn_app = connexion.FlaskApp(__name__)

@conn_app.app.before_request
def before_request():
    for h in request.headers:
        logger.debug('header %s', h)
   logger.debug('data %s', request.get_data())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71336502

复制
相关文章

相似问题

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