Swagger - 将多个安全性参数添加到同一模式定义中

问题描述 投票:8回答:2

目标

向API中的每个请求包含多个安全标头

问题

我正在尝试向Swagger YAML安全定义添加多个标头。我已经通过API搜索了但没有很多运气但是我发现在进行'尝试此操作'时我需要选择一个。而不是能够同时使用两者。这是正确的还是我做错了什么?

片段

securityDefinitions:
  userEmail:
    type: apiKey
    name: User Email
    in: header
  clientId:
    type: apiKey
    name: Client Id
    in: header

security: [ { userEmail: [], clientId: []  } ]

另类?

如果我试图这样做不可能......是否可以将这些参数指定为swagger文档中所有其余路径的默认值?

本周我是Swagger的新手任何人都没有遇到任何问题...但我找不到任何好的例子。

如果可以提供任何非常有用的指导,非常感谢

swagger
2个回答
6
投票

你的SecurityDefintions对象看起来不错。要小心

security: [ { userEmail: [], clientId: []  } ]

意味着API客户端必须立即使用userEmail身份验证和clientId身份验证!你可能意味着:

security: [ { userEmail: [] }, { clientId: []  } ]

这意味着API客户端必须使用userEmail身份验证或clientId身份验证。

为避免反复重复此定义,您可以使用适用于所有路径的全局security属性,而不使用自己的security对象:

security: [ { userEmail: [] }, { clientId: []  } ]
paths:
  "/foo":
    get:
    post:

或者使用引用来表示显性或使用多个共同值:

paths:
  "/foo":
    get:
      security:
        "$ref": "#/definitions/lowSecurity"
    post:
      security:
        "$ref": "#/definitions/highSecurity"
definitions:
  lowSecurity:  [ { foo: [] }, { bar: []  } ]
  highSecurity: [ { foo: [] } ]

参考

Swagger2规范在Operation Object下声明:

security [Security Requirement Object]

声明应用此操作的安全方案。值列表描述了可以使用的备用安全方案(即,安全要求之间存在逻辑OR)。此定义将覆盖任何声明的顶级安全性。要删除顶级安全声明,可以使用空数组。

Security Requirement Object描述如下:

列出执行此操作所需的安全方案。该对象可以在其中声明多个安全方案,这些安全方案都是必需的(即,方案之间存在逻辑AND)。

每个属性使用的名称必须对应于安全定义中声明的安全方案。


0
投票

OAS 3:https://swagger.io/docs/specification/authentication/

Using Multiple Authentication Types

某些REST API支持多种身份验证类型。 security部分允许您使用逻辑OR和AND组合安全性要求,以实现所需的结果。 security使用以下逻辑:

security:    # A OR B
  - A
  - B

security:    # A AND B
  - A
    B

security:    # (A AND B) OR (C AND D)
  - A
    B
  - C
    D
© www.soinside.com 2019 - 2024. All rights reserved.