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

时间:2015-06-19 15:27:17

标签: swagger

目标

在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的新手任何人都没有遇到任何问题...但我找不到任何好的例子。

如果可以给出任何非常有帮助的指导 非常感谢

2 个答案:

答案 0 :(得分: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)。

     

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

答案 1 :(得分:0)

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

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

security:    # A OR B
  - A
  - B

security:    # A AND B
  - A
    B

security:    # (A AND B) OR (C AND D)
  - A
    B
  - C
    D