【问题标题】:How do I automatically authorize all endpoints with Swagger UI?如何使用 Swagger UI 自动授权所有端点?
【发布时间】:2017-12-25 06:45:52
【问题描述】:

我部署了一个完整的 API,并可通过 Swagger UI 访问。它使用基于 HTTPS 的基本身份验证,并且可以轻松点击“授权”按钮并输入凭据,并且与不错的 Try it out 一起使用效果很好!功能。

但是,我想使用共享的用户名和密码制作 API 的公共沙盒版本,该版本始终经过身份验证;也就是说,任何人都不应该打开授权对话框来输入凭据。

我尝试根据另一个 Stack Overflow 问题的答案输入授权,方法是将以下代码放入 HTML 页面上的 script 元素中:

window.swaggerUi.load();
swaggerUi.api.clientAuthorizations.add("key", 
  new SwaggerClient.ApiKeyAuthorization(
  "Authorization", "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", "header"));

但是,当我点击Try it out! 按钮时,没有使用授权。

在所有端点上全局设置 auth 标头的正确方法是什么,这样用户就不必手动输入凭据?

(我知道这听起来像是一个奇怪的问题,但就像我提到的,它是一个公共用户名/密码。)

【问题讨论】:

  • 哪个版本的 Swagger UI?我认为该代码适用于 2.x,并且在 3.x 中(还)不起作用。
  • 确实是2.0,可惜不行……可能和YAML规范中已有的字段有些冲突,比如securityDefinitions?

标签: basic-authentication swagger-ui swagger-2.0


【解决方案1】:

我找到了一个解决方案,使用PasswordAuthorization 而不是ApiKeyAuthorization

正确的做法是将下面这行添加到onComplete 处理程序中:

      swaggerUi.api.clientAuthorizations.add("basicAuth",
        new SwaggerClient.PasswordAuthorization(
          "8939927d-4b8a-4a69-81e4-8290a83fd2e7",
          "fbb7a689-2bb7-4f26-8697-d15c27ec9d86"));

swaggerUi 被传递给回调,所以这是要使用的值。此外,请确保您的身份验证对象的名称与 YAML 文件中的名称匹配。

【讨论】:

    【解决方案2】:

    对于那些使用 Swagger UI 3.x(更具体地说,v.3.13.0+)的用户,您可以使用以下方法自动授权:

    • preauthorizeBasic - 用于基本身份验证
    • preauthorizeApiKey – 用于 API 密钥和 OAS3 Bearer 身份验证

    要使用这些方法,必须在您的 API 定义中定义相应的安全方案。例如:

    openapi: 3.0.0
    ...
    components:
      securitySchemes:
    
        basicAuth:
          type: http
          scheme: basic
    
        api_key:
          type: apiKey
          in: header
          name: X-Api-Key
    
    security:
      - basicAuth: []
      - api_key: []
    

    onComplete 处理程序调用preauthorizeNNN,如下所示:

    // index.html
    
    const ui = SwaggerUIBundle({
      url: "https://my.api.com/swagger.yaml",
      ...
    
      onComplete: function() {
    
        // Default basic auth
        ui.preauthorizeBasic("basicAuth", "username", "password");
    
        // Default API key
        ui.preauthorizeApiKey("api_key", "abcde12345");
      }
    })
    

    在此示例中,“basicAuth”和“api_key”是 API 定义中指定的安全方案的密钥名称。

    【讨论】:

    • 你在哪里改变这个文件?
    • @Simon_Weaver 如果你的意思是index.html,它就是 Swagger UI 网页。如果你使用from the repository下载的Swagger UI,文件为dist\index.html
    • 注意preauthorizeNNN必须onComplete调用。如果你在构造SwaggerUIBundle之后直接调用它,它可能不起作用-见Swagger UI issue #4382
    猜你喜欢
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 2020-11-27
    • 2022-11-08
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    相关资源
    最近更新 更多