.Net Core Swashbuckle 跳过重定向上的授权标头



在.Net Core Web API中,我使用Swashbuckle集成了Swagger。该 API 受到保护,因此在 Swagger UI 中执行某些请求之前,需要授权和登录。这一切都很好用。

现在,一个 API 调用会创建一个预签名 URL,并将 HTTP 重定向返回到文件服务器(预签名 URL(。

问题是 Swagger UI 将带有 JWT 令牌的授权标头发送到文件服务器 (MinIO(。这会导致文件服务器接收两种不同的身份验证机制,并响应无效的请求。

有没有办法影响 Swagger UI 如何处理重定向或不发送重定向令牌?

我也

遇到了这个问题,并意识到当fetch重定向到预签名的 S3 URL 时,您无法阻止它从您的 API 发送授权标头。

最终,我能够通过使用 Swagger 的 responseInterceptor 配置参数和一个自定义函数来做到这一点,该函数检测来自 S3 的错误请求 (400( 响应,然后重新发出带有 credentials: 'omit'fetch请求。

这是我对 Swagger 的自定义响应拦截器:

// swagger-ui-extensions.js
function serializeHeaderValue(value) {
  const isMulti = value.includes(', ');
  return isMulti ? value.split(', ') : value;
}
function serializeHeaders(headers = {}) {
  return Array.from(headers.entries()).reduce((acc, [header, value]) => {
    acc[header] = serializeHeaderValue(value);
    return acc;
  }, {});
}
function myResponseInterceptor(response) {
  // NOTE: Additional checks should probably be added whether to re-issue the fetch. This was just an initial starting point.
  if (response.ok === false && response.status === 400 && response.headers['server'] === 'AmazonS3') {
    // Here is the important part, re-issue fetch but don't allow our Authentication header to flow
    response = fetch(response.url, { credentials: 'omit' })
      .then(nativeResponse => {
        // We can't return the native response because Swagger UI attempts to assign the header property (and potentially other properties
        // too) on the response. So return a serialized clone of the native response. FYI, this is the same exact logic from Swagger's fake
        // implementation of fetch.
        const getBody = nativeResponse.blob || nativeResponse.buffer;
        return getBody.call(nativeResponse).then(body => {
          return {
            ok: nativeResponse.ok,
            url: nativeResponse.url,
            status: nativeResponse.status,
            statusText: nativeResponse.statusText,
            headers: serializeHeaders(nativeResponse.headers),
            data: body
          };
        });
      });
  }
  return response;
}

然后,我必须在初始化 Swagger UI 时指定我的自定义myResponseInterceptor index.html

      // (other code omitted for brevity...)
      // Make sure to include your custom JS in the page
      // <script src="./swagger-ui-extensions.js"></script>
      // Specifying the custom responseInterceptor here...
      configObject.responseInterceptor = myResponseInterceptor;
      // Begin Swagger UI call region
      const ui = SwaggerUIBundle(configObject);
      ui.initOAuth(oauthConfigObject);
      // End Swagger UI call region
      window.ui = ui;

我正在使用 ASP.NET Core,并使用这些说明为Swagger UI提供我自己的index.html:https://github.com/domaindrivendev/Swashbuckle.AspNetCore#customize-indexhtml

毕竟,这出人意料地奏效了,我能够在 Swagger 中看到来自 S3 的重定向响应。

最新更新